Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [Delphi] "Одноразовое" рег. выражение (https://forum.antichat.xyz/showthread.php?t=122814)

Kuzya 30.05.2009 08:58

[Delphi] "Одноразовое" рег. выражение
 
Здравствуйте. Столкнулся со следующей проблемой. Мне нужно из текста (ответ на http-запрос) выдернуть все совпадения с выражением
Код:

<li><h3><a href="(.*)"
Использую библиотеку RegExpr (regexpstudio.com) я получил следующий код
Код:

HResult := idHttp1.Get('http://.....');
regexptpl := '<li><h3><a href="(.*)"';
  with TRegExpr.Create do try
    Expression := regexptpl;
    ModifierI := true;
    ModifierS := true;
    ModifierG := false;
    if Exec(HResult) then begin
      showmessage(Match[1]);
    end;
    finally Free;
  end;

Но он находит только первое совпадение из всего текста. Оно помещается ячейку 1 массива Match и всё, остальные ячейки пусты. Но совпадений в полученном тексте должно быть около 10. Помню с подобной проблемой сталкивался в php и решил её с использованием preg_match_all вместо preg_match. Покопавшись по документации к используемой библиотеке я ничего не нашёл. Единственное на что обратил внимание - функция ExecNext. Я думал что при каждом вызове она будет искать следующее совпадение, но она тоже зацикливалась на 1-ом свопадении.
Если кто сталкивался с подобной проблемой, помогите пожалуйста.

JeDaSe 30.05.2009 09:36

а pos(); не проще будет?
http://forum.antichat.ru/thread119447.html

mailbrush 30.05.2009 09:54

Цитата:

Здравствуйте. Столкнулся со следующей проблемой. Мне нужно из текста (ответ на http-запрос) выдернуть все совпадения с выражением
Код:

<li><h3><a href="(.*)"
Использую библиотеку RegExpr (regexpstudio.com) я получил следующий код
Код:

HResult := idHttp1.Get('http://.....');
regexptpl := '<li><h3><a href="(.*)"';
  with TRegExpr.Create do try
    Expression := regexptpl;
    ModifierI := true;
    ModifierS := true;
    ModifierG := false;
    if Exec(HResult) then begin
      showmessage(Match[1]);
    end;
    finally Free;
  end;

Но он находит только первое совпадение из всего текста. Оно помещается ячейку 1 массива Match и всё, остальные ячейки пусты. Но совпадений в полученном тексте должно быть около 10. Помню с подобной проблемой сталкивался в php и решил её с использованием preg_match_all вместо preg_match. Покопавшись по документации к используемой библиотеке я ничего не нашёл. Единственное на что обратил внимание - функция ExecNext. Я думал что при каждом вызове она будет искать следующее совпадение, но она тоже зацикливалась на 1-ом свопадении.
Если кто сталкивался с подобной проблемой, помогите пожалуйста.
Юзай цикл
Код:

while not ExecNext...
Цитата:

а pos(); не проще будет?
http://forum.antichat.ru/thread119447.html
Регулярки удобнее.

Kuzya 30.05.2009 13:23

mailbrush, спасибо!


Время: 07:52