Delphi: подсчитывать количество строк, которые происходят в другой строке
Я использую Delphi 2007 и задаюсь вопросом, есть ли простой способ подсчета количества раз, когда строка встречается в другой строке. Любая встроенная функция, которую я могу использовать?
Примеры:
- "Как" происходит один раз в строке "Как вы?"
- "do" происходит дважды в строке "Как вы это делаете?"
Ответы
Ответ 1
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;
Ответ 2
Один из самых умных способов, которые я когда-либо видел:
{ 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 }
Ответ 3
Если вы часто находите поиск в большом тексте, и производительность становится проблемой, вы можете попробовать алгоритм поиска Boyer-Moore.
наихудший случай, чтобы найти все вхождения в тексте требуется приблизительно 3n сравнение
Реализация в Delphi может быть найдена на нашем собственном SO here
Мне нужны три быстрых на больших строках функции: быстрый поиск, быстрый поиск и заменить, и быстро счет подстроки в строке.
Ответ 4
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;
Ответ 5
function stringcount(pBefore: String; pSubstring: String; pFlags: TReplaceFlags): Integer;
begin
result:= round((pBefore.Length - stringreplace(pBefore, pSubstring, '', pFlags).Length) / pSubstring.Length);
end;