versiones programacion informatica full embarcadero descargar borland delphi delphi-xe2 delphi-2010

delphi - programacion - ¿Cómo contar el número de ocurrencias de un cierto char en una cadena?



delphi wikipedia (5)

¿Cómo puedo contar el número de apariciones de un determinado personaje en una cadena en Delphi?

Por ejemplo, supongamos que tengo la siguiente cadena y me gustaría contar el número de comas en ella:

S := ''1,2,3'';

Entonces me gustaría obtener 2 como resultado.


A pesar de que ya se aceptó una respuesta, estoy publicando la función más general a continuación porque me parece muy elegante. Esta solución es para contar las ocurrencias de una cadena en lugar de un carácter.

{ 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 }


Este puede hacer el trabajo si no está manejando texto grande

...

uses RegularExpressions;

...

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


Puedes usar esta simple función:

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;


Y para aquellos que prefieren el bucle del enumerador en las versiones modernas de Delphi (ninguna mejor que la solución aceptada por Andreas, solo una solución alternativa):

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;


Puede usar el beneficio de la función StringReplace como:

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