Delphi: nombre de fois qu'une chaîne apparaît dans une autre chaîne

j'utilise Delphi 2007 et je me demande s'il y a une façon simple de compter le nombre de fois qu'une chaîne se produit dans une autre chaîne. Une fonction intégrée que je peux utiliser?

exemples:

  • "Comment" se produit une fois dans la chaîne "Comment allez-vous?"
  • "" apparaît deux fois dans la chaîne de caractères "Comment faites-vous?"
20
demandé sur RRUZ 2011-03-10 23:09:18

4 réponses

function Occurrences(const Substring, Text: string): integer;
var
  offset: integer;
begin
  result := 0;
  offset := PosEx(Substring, Text, 1);
  while offset <> 0 do
  begin
    inc(result);
    offset := PosEx(Substring, Text, offset + length(Substring));
  end;
end;
37
répondu Andreas Rejbrand 2011-03-10 20:32:27

une des façons les plus intelligentes que j'ai jamais vu pour faire ceci:

{ Returns a count of the number of occurences of SubText in Text }
function CountOccurences( const SubText: string;
                          const Text: string): Integer;
begin
  if (SubText = '') OR (Text = '') OR (Pos(SubText, Text) = 0) then
    Result := 0
  else
    Result := (Length(Text) - Length(StringReplace(Text, SubText, '', [rfReplaceAll]))) div  Length(subtext);
end;  { CountOccurences }
8
répondu RobertFrank 2011-03-11 03:59:05

si vous vous trouvez à rechercher fréquemment des occurences dans un grand corps du texte et la performance devient un problème, vous pouvez essayer le Boyer-Moore search algorithm .

le pire des cas, de trouver toutes les occurrences dans un texte nécessite environ 3n comparaisons

une implémentation à Delphi peut être trouvé à notre propre SO ici

j'ai besoin de trois cordes rapides fonctions: recherche rapide, recherche rapide et remplacer, et le compte rapide de des sous-chaînes dans une chaîne de caractères.

4
répondu Lieven Keersmaekers 2017-05-23 10:29:27

uses
  StrUtils;    

function Occurrences(const Substring, Text: string;
  const ignoreUppercase: Boolean = false): Integer;
var
  inSubstring, inText: string;
  inPos: Integer;
begin
  Result:= 0;

  if (Substring = '') or (Text = '') then
    Exit;

  if ignoreUppercase then
  begin
    inSubstring:= AnsiLowerCase(Substring);
    inText:=  AnsiLowerCase(Text);
  end
  else
  begin
    inSubstring:= Substring;
    inText:=  Text;
  end;

  inPos:= 1;

  repeat
    inPos:= posEx(inSubstring, inText, inPos);
    if inPos > 0 then
    begin
      Inc(Result);
      inPos:= inPos + Length(inSubstring);
    end;
  until inPos = 0;
end;

1
répondu GoodMan 2014-07-29 09:48:16