web-dev-qa-db-ja.com

文字列内の特定の文字の出現数を数える方法は?

Delphiで文字列内の特定の文字の出現回数を数えるにはどうすればよいですか?

たとえば、次の文字列があり、その中のカンマの数をカウントしたいとします。

S := '1,2,3';

次に、結果として2を取得します。

23
user1556433

次の単純な関数を使用できます。

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;
38

回答はすでに受け入れられていますが、とてもエレガントなので、より一般的な関数を以下に掲載します。このソリューションは、文字ではなく文字列の出現をカウントするためのものです。

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

そして、最新の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;
17
Ken White

これは、大きなテキストを処理していない場合の作業を行うことができます

...

uses RegularExpressions;

...

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

StringReplace関数の利点は次のように使用できます。

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