Как подсчитать количество вхождений определенной строки char в строку?
Как подсчитать количество вхождений определенного символа в строке в Delphi?
Например, предположим, что у меня есть следующая строка и хотелось бы подсчитать количество запятых в ней:
S := '1,2,3';
Тогда я хотел бы получить 2.
Ответ 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;