2013-03-08 25 views
16

デルファイの文字列内の特定の文字の出現回数をどのように数えることができますか?例えば文字列内の特定の文字の出現回数をカウントするには?

、私は次の文字列を持っており、それにカンマの数をカウントしたいことを想定しています

S := '1,2,3'; 

その後、私は結果として2を取得したいと思います。

+0

http://delphi.cjcsoft.net//viewthread.php?tid=43892 – Ampere

答えて

27

あなたはこの単純な関数を使用することができます。

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; 
+0

私はそれを行うことはできません単線? –

+10

@NareshKumar:はい、もちろんです: 'OccurrencesOfChar(myString、 '、')' –

+2

+1ですが、chrは既に意味があるので貧しい名前です。私はC –

15

そして(アンドレアス、単に代替ソリューションによって受け入れソリューションよりもない任意のより良い)現代のDelphiのバージョンで列挙ループを好む人のため

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

この1つはあなたが大規模なテキスト

を処理していない場合のための作業を行うことができます...

uses RegularExpressions; 

...

答えはすでに承認されているにもかかわらず
function CountChar(const s: string; const c: char): integer; 
begin 
Result:= TRegEx.Matches(s, c).Count 
end; 
+0

なぜそれはDelphiでうまくいかないでしょうか?正規表現は、大規模なテキスト本体を扱う際には非常に優れています。 –

15

私はそれがとてもエレガント見つけるので、私は以下より一般的な機能を掲示しています。この解決策は、文字ではなく文字列の出現を数えるためのものです。

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

+1は芸術的な解釈のためです。 –

+1

興味深い見解です!おそらく、最初の文を 'Result:= Pos(SubText、Text);に単純化することができます。結果> 0の場合は... '[+1] – TLama

+0

美しいロバートです。 – Sam

0

君はStringReplace機能の利点を使用することができます。

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