Как подсчитать количество вхождений определенной строки char в строку? - программирование
Подтвердить что ты не робот

Как подсчитать количество вхождений определенной строки char в строку?

Как подсчитать количество вхождений определенного символа в строке в Delphi?

Например, предположим, что у меня есть следующая строка и хотелось бы подсчитать количество запятых в ней:

S := '1,2,3';

Тогда я хотел бы получить 2.

4b9b3361

Ответ 1

Вы можете использовать эту простую функцию:

function OccurrencesOfChar(const S: string; const C: char): integer;
var
  i: Integer;
begin
  result := 0;
  for i := 1 to Length(S) do
    if S[i] = C then
      inc(result);
end;

Ответ 2

И для тех, кто предпочитает цикл перечислителя в современных версиях Delphi (не лучше, чем принятое решение Андреаса, просто альтернативное решение):

function OccurrencesOfChar(const ContentString: string;
  const CharToCount: char): integer;
var
  C: Char;
begin
  result := 0;
  for C in ContentString do
    if C = CharToCount then
      Inc(result);
end;

Ответ 3

Даже если ответ уже принят, я публикую более общую функцию ниже, потому что считаю ее такой элегантной. Это решение предназначено для подсчета вхождений строки, а не символа.

{ Returns a count of the number of occurences of SubText in Text }
function CountOccurences( const SubText: string;
                          const Text: string): Integer;
begin
  Result := Pos(SubText, Text); 
  if Result > 0 then
    Result := (Length(Text) - Length(StringReplace(Text, SubText, '', [rfReplaceAll]))) div  Length(subtext);
end;  { CountOccurences }

Ответ 4

Это может работать, если вы не обрабатываете большой текст

...

uses RegularExpressions;

...

function CountChar(const s: string; const c: char): integer;
begin
 Result:= TRegEx.Matches(s, c).Count
end;

Ответ 5

Вы можете использовать преимущество функции StringReplace как:

function OccurencesOfChar(ContentString:string; CharToCount:char):integer;
begin
   Result:= Length(ContentString)-Length(StringReplace(ContentString, CharToCount,'', [rfReplaceAll, rfIgnoreCase]));
end;