2013-03-08 23 views

Odpowiedz

27

można wykorzystywać tę prostą funkcję:

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

Nie mogę zrobić go w pojedyncza linia? –

+10

@NareshKumar: Tak, oczywiście: 'OccurrencesOfChar (myString, ',')' –

+2

+1, ale chr jest kiepską nazwą, ponieważ ma już znaczenie. Proponuję C –

15

A dla tych, którzy wolą pętlę numeratora w nowoczesnych wersjach Delphi (nie lepiej niż przyjętego rozwiązania Andreas, tylko rozwiązanie alternatywne):

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

Ten może wykonywać pracę na jeśli nie jesteś przenoszenia dużego tekstu

...

uses RegularExpressions; 

...

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

Dlaczego nie byłoby dobrze na Delphi? Wyrażenia regularne są całkiem dobre w obsłudze dużych obiektów tekstowych. –

15

Chociaż odpowiedź została już przyjęta, jestem delegowania bardziej ogólną funkcję poniżej, ponieważ uważam, że tak elegancki. To rozwiązanie służy do zliczania wystąpień ciągu znaków, a nie znaku.

{ 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 dla interpretacji artystycznej. –

+1

Interesujący punkt widzenia! Może mógłbyś uprościć pierwsze stwierdzenie do 'Wynik: = Pos (SubText, Text); jeśli Wynik> 0 to ... '[+1] – TLama

+0

To jest piękny Robert. – Sam

0

można wykorzystywać korzyści z funkcji StringReplace jak:

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