Comment compter le nombre d'occurrences d'un certain caractère dans une chaîne dans Delphi?
Par exemple, supposons que je possède la chaîne suivante et que je souhaite compter le nombre de virgules qu'il contient:
S := '1,2,3';
Ensuite, j'aimerais obtenir 2
comme résultat.
Vous pouvez utiliser cette fonction simple:
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;
Même si une réponse a déjà été acceptée, je poste la fonction plus générale ci-dessous parce que je la trouve si élégante. Cette solution permet de compter les occurrences d'une chaîne plutôt que d'un caractère.
{ 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 }
Et pour ceux qui préfèrent la boucle énumératrice dans les versions modernes de Delphi (pas mieux que la solution acceptée par Andreas, juste une solution alternative):
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;
Celui-ci peut faire le travail si vous ne gérez pas de gros texte
...
uses RegularExpressions;
...
function CountChar(const s: string; const c: char): integer;
begin
Result:= TRegEx.Matches(s, c).Count
end;
Vous pouvez utiliser l’avantage de la fonction StringReplace en tant que:
function OccurencesOfChar(ContentString:string; CharToCount:char):integer;
begin
Result:= Length(ContentString)-Length(StringReplace(ContentString, CharToCount,'', [rfReplaceAll, rfIgnoreCase]));
end;