una reemplazar recorrer pos funciones funcion extraer eliminar caracteres cadena string delphi delphi-2007

string - reemplazar - Delphi: cuenta el número de veces que se produce una cadena en otra cadena



reemplazar caracteres en delphi (4)

Si se encuentra con frecuencia buscando ocurrencias en una gran cantidad de texto y el rendimiento se convierte en un problema, puede probar el algoritmo de búsqueda de Boyer-Moore .

el peor de los casos para encontrar todas las ocurrencias en un texto necesita aproximadamente 3n comparaciones

Una implementación en Delphi se puede encontrar en nuestro SO here

Necesito tres funciones fast-on-large-strings: búsqueda rápida, búsqueda rápida y reemplazo, y conteo rápido de subcadenas en una cadena.

Estoy usando Delphi 2007 y me pregunto si hay una manera simple de contar la cantidad de veces que una cadena se produce en otra cadena. ¿Alguna función integrada que pueda usar?

Ejemplos:

  • "Cómo" ocurre una vez en la cadena "¿Cómo estás?"
  • "do" aparece dos veces en la cadena "¿Cómo estás?"

Una de las maneras más inteligentes que he visto para hacer esto:

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


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;


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;