• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Поиск подстроки между двух подстрок ?

  • Автор темы Baton77
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

Baton77

Использую функию inside - возвращает подстроку, вложенную между парой
подстрок Front ... Back
Код:
function inside(const Search, Front, Back: string): string;
var
Index, Len: byte;
begin
Index := RPos(Front, before(Search, Back));
Len := Pos(Back, Search);
if (Index > 0) and (Len > 0) then
Result := Copy(Search, Index + 1, Len - (Index + 1))
else
Result := '';
end;
Она цепляет ещё две функции : RPos() возвращает первый символ последней найденной
подстроки Find в строке Search.
Код:
function RPos(const Find, Search: string): byte;
var
FindPtr, SearchPtr, TempPtr: PChar;
begin
FindPtr := StrAlloc(Length(Find) + 1);
SearchPtr := StrAlloc(Length(Search) + 1);
StrPCopy(FindPtr, Find);
StrPCopy(SearchPtr, Search);
Result := 0;
repeat
TempPtr := StrRScan(SearchPtr, FindPtr^);
if TempPtr <> nil then
if (StrLComp(TempPtr, FindPtr, Length(Find)) = 0) then
begin
Result := TempPtr - SearchPtr + 1;
TempPtr := nil;
end
else
TempPtr := #0;
until TempPtr = nil;
end;
и before() возвращает часть стоки, находящейся перед
первой найденной подстроки Find в строке Search
Код:
function before(const Search, Find: string): string;
var
index: byte;
begin
index := Pos(Find, Search);
if index = 0 then
Result := Search
else
Result := Copy(Search, 1, index - 1);
end;
Так вот, глюк заключается в том, что inside возвращает только первую найденную подстроку в строке, а их может быть, скажем, десять...
В новой строке происходит то же.
Как исправить? :blink:
 
X

x77

например, удалить найденную подстроку из основной (Delete (Pos (sub, s), Length (sub)) и т.д.) и в оставшейся части искать дальше. так можно получить список всех вхождений строки.
 
B

Baton77

Вобщем функция работает, но не так как надо...
Задаю разделители
Код:
Temp := inside(text, '=', ']');
Вот пример строки в которой надо реализовать этот Temp :
Интерес [ color =#ff0009 ]публики[ /color ] к [ size =18 ]классическому[ /size ] форм-фактору в [ color =#1200ff ]бизнес-категории[ /color ] понятен.
Так вот, функция обрабатывает как Temp только #ff0009 , а 18 и #1200ff игнорирует и
переходит на обработку следующей строки.
Как заставить её понимать и 18 и #1200ff ? :)
 
B

Barmutik

Вроде как дали ответ уже .. или удаляй то что было найдено или ищи вхождение начиная с необходимой позиции в строке ...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!