23

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

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

S := '1,2,3';

2それでは結果として入手したいと思います。

4

7 に答える 7

39

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

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;
于 2013-03-08T12:57:34.430 に答える
20

回答はすでに受け付けていますが、とてもエレガントだと思うので、以下にもっと一般的な関数を投稿します。このソリューションは、文字ではなく文字列の出現をカウントするためのものです。

{ 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 }
于 2013-03-08T16:15:11.713 に答える
18

そして、最新の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;
于 2013-03-08T14:02:32.233 に答える
12

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

..。

uses RegularExpressions;

..。

function CountChar(const s: string; const c: char): integer;
begin
 Result:= TRegEx.Matches(s, c).Count
end;
于 2013-03-08T14:52:01.453 に答える
2

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

function OccurencesOfChar(ContentString:string; CharToCount:char):integer;
begin
   Result:= Length(ContentString)-Length(StringReplace(ContentString, CharToCount,'', [rfReplaceAll, rfIgnoreCase]));
end;
于 2017-04-03T18:56:40.677 に答える
1

シンプルなソリューションと優れたパフォーマンス(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;
于 2020-09-10T08:26:31.060 に答える
0

うーん...何か足りないの?なぜだけではないのですか...

      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;//
于 2021-02-10T12:56:22.157 に答える