web-dev-qa-db-fra.com

Comment compter le nombre d'occurrences d'un certain caractère dans une chaîne?

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.

18
user1556433

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;
33
Andreas Rejbrand

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 }
17
RobertFrank

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;
15
Ken White

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;
9
Raul

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;
2
Marwan Almukh