Поиск N-ого вхождения подстроки в строку

Материал из DRKB

Поиск N-ого вхождения подстроки в строку[править | править код]

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Поиск N-ого вхождения подстроки в строку

Зависимости: SysUtils
Автор:       panov, panov@hotbox.ru, Екатеринбург
Copyright:   panov
Дата:        19 апреля 2002 г.
***************************************************** }

function SearchString(const FindStr, SourceString: string; Num: Integer):
  Integer;
var
  FirstSym: PChar; // Ссылка на первый символ

  function MyPos(const FindStr, SourceString: PChar; Num: Integer): PChar;
  begin
    Result := AnsiStrPos(SourceString, FindStr);
      // Поиск вхождения подстроки в строку
    if (Result = nil) then
      Exit; // Подстрока не найдена
    Inc(Result); // Смещаем указатель на следующий символ
    if Num = 1 then
      Exit; // Если нужно первое вхождение - заканчиваем
    if num > 1 then
      Result := MyPos(FindStr, Result, num - 1);
    // Рекурсивный поиск следующего вхождения
  end;

begin
  FirstSym := PChar(SourceString);
  // Присваиваем адрес первого символа исходной строки
  Result := MyPos(PChar(FindStr), PChar(SourceString), Num) - FirstSym;
  // Номер позиции в строке
  if Result < 0 then
    Result := 0; // Возвращаем номер позиции
end;

// Пример использования: 

var
  StrF, StrSrc: string;
  n: Integer;
begin
  StrF := 'стр';
  StrSrc := 'Поиск подстроки в строке';
  n := SearchString(StrF, StrSrc, 2); //n будет равна 19
end;


Source: http://delphibase.endimus.com
ID: 00869