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;