Delphiで文字列内の特定の文字の出現回数をカウントするにはどうすればよいですか?
たとえば、次の文字列があり、その中のコンマの数を数えたいとします。
S := '1,2,3';
2
それでは結果として入手したいと思います。
Delphiで文字列内の特定の文字の出現回数をカウントするにはどうすればよいですか?
たとえば、次の文字列があり、その中のコンマの数を数えたいとします。
S := '1,2,3';
2
それでは結果として入手したいと思います。
この単純な関数を使用できます。
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;
回答はすでに受け付けていますが、とてもエレガントだと思うので、以下にもっと一般的な関数を投稿します。このソリューションは、文字ではなく文字列の出現をカウントするためのものです。
{ 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 }
そして、最新のDelphiバージョンの列挙子ループを好む人のために(Andreasによって受け入れられたソリューションよりも優れているわけではなく、単なる代替ソリューションです):
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;
これは、大きなテキストを処理していない場合の作業を行うことができます
..。
uses RegularExpressions;
..。
function CountChar(const s: string; const c: char): integer;
begin
Result:= TRegEx.Matches(s, c).Count
end;
StringReplace関数の利点は次のように使用できます。
function OccurencesOfChar(ContentString:string; CharToCount:char):integer;
begin
Result:= Length(ContentString)-Length(StringReplace(ContentString, CharToCount,'', [rfReplaceAll, rfIgnoreCase]));
end;
シンプルなソリューションと優れたパフォーマンス(Delphi 7用に作成しましたが、他のバージョンでも機能するはずです):
function CountOccurences(const ASubString: string; const AString: string): Integer;
var
iOffset: Integer;
iSubStrLen: Integer;
begin
Result := 0;
if (ASubString = '') or (AString = '') then
Exit;
iOffset := 1;
iSubStrLen := Length(ASubString);
while (True) do
begin
iOffset := PosEx(ASubString, AString, iOffset);
if (iOffset = 0) then
Break;
Inc(Result);
Inc(iOffset, iSubStrLen);
end;
end;
うーん...何か足りないの?なぜだけではないのですか...
kSepChar:=',';//to count commas
bLen:=length(sLineToCheck);
bCount:=0;//The numer of kSepChars seen so far.
bPosn:=1;//First character in string is at position 1
for bPosn:=1 to bLen do begin
if sLineToCheck[bPosn]=kSepChar then inc(bCount);
end;//