Количество вхождений подстроки в строке

Количество вхождений подстроки в строке

Несмотря на то, что библиотеки SysUtils и StrUtils предоставляют сотни процедур для работы со строками, всегда есть такие, которые «отсутствуют».

Одна из функций, которая бывает нужна, функция, которая возвращает число, сколько раз строка появляется внутри другой строки.

Вот пример: в пути «C:\Programs\MyApp\Source\Main» какой уровень вложенности папки «Main» — то есть, сколько раз символ «\» (разделитель пути) встречается в полном пути?

Решением может быть пользовательская функция SubStringOccurrences:

uses StrUtils;

function SubStringOccurences(const subString, sourceString : string) : integer;
var
pEx: integer;
begin
result := 0;
pEx := PosEx(subString, sourceString, 1);
while pEx <> 0 do
begin
Inc(result);
pEx := PosEx(subString, sourceString, pEx + Length(subString));
end;
end;
И на предыдущий вопрос функция SubStringOccurrences возвращает 4, то есть символ «\» появляется 4 раза в строке «C:\Programs\MyApp\Source\Main«.

Количество вхождений подстроки в строку

Вам необходимо добавить библиотеку StrUtils для использования функции PosEx. Функция PosExвозвращает целое число, показывающее положение первого вхождения одной строки в другой, где поиск начинается с указанной позиции.

Вызвав функцию PosEx в цикле, мы получим число вхождений одной строки в другой.

Обратите внимание, что SubStringOccurrences чувствительна к регистру, так как функция PosExчувствительна к регистру.
SubStringOccurrences (‘A’, ‘абракадабра «) вернет 0, а SubStringOccurrences (‘а’,’ абракадабра») вернет 5.

Без учета регистра функция SubStringOccurrences может выглядеть следующим образом:

uses StrUtils;

function SubStringOccurences(const subString, sourceString : string; caseSensitive : boolean) : integer;
var
pEx: integer;
sub, source : string;
begin
if caseSensitive then
begin
sub := subString;
source := sourceString;
end
else
begin
sub := LowerCase(subString);
source := LowerCase(sourceString);
end;

result := 0;
pEx := PosEx(sub, source, 1);
while pEx <> 0 do
begin
Inc(result);
pEx := PosEx(sub, source, pEx + Length(sub));
end;
end;

Добавить комментарий