LINUX.ORG.RU

Perl, regexp


0

1

Поскажите, пожалуйста, правильный способ вытащить отсюда:

<a href="selprocess=0">First</a><a href="selprocess=1">Second</a><a href="selprocess=2">Third</a>

число 2, используя ключи: selprocess и Third.

Вот так (кусок функции):

my $str = "Third";
$_[0] =~ m/selprocess=(\d+).*selprocess=(\d+).*($str)/i;
$2;

оно достаёт, то, что надо, но если ссылка с Third стоит на первом месте, ничего не находит.

Вот так:

my $str = "Third";
$_[0] =~ m/(selprocess=(\d+).*)*selprocess=(\d+).*($str)/i; 
$3;

оно вроде бы достаёт число 2 независимо от того, в какой позиции находится ссылка с Third, но в реальности на уже моем, не тестовом для форума образце, где страничка большая и число ссылок большое, оно на регэкспе выдаёт:

Complex regular subexpression recursion limit (32766) exceeded at ... line ...

Конечно можно последовательно проверить первый вариант, а потом выполнить:

$_[0] =~ m/selprocess=(\d+).*($str)/i;
$1;

достав нужное, но хочется одним регэкспом вытащить.

★★★

Последнее исправление: eRazor (всего исправлений: 3)
Ответ на: комментарий от anonymous

Вопрос по регэкспу. Проблему-то я решил двумя последовательными проверками, мне интересно как регэксп правильный сделать.

eRazor ★★★
() автор топика
Ответ на: комментарий от redgremlin

Это не помогает, захватывает:

selprocess=0">First</a><a href=«selprocess=1»>Second</a><a href=«selprocess=2»>Third

т.е. $1 будет равен 0.

eRazor ★★★
() автор топика
Ответ на: комментарий от redgremlin

Ну, сам подумай (а я проверил уже давно, сам думал в эту сторону), ? ограничивает жадность, selprocess=(\d+).*?($str) ищет от первого попавшегося selprocess=(\d+) до ближайшего $str, чем и является абсолютно весь кусок, который я написал в предыдущем сообщении и ограничение жадности вообще никак не срабатывает. Тут нужно другое: поиск $str и от него назад ограничивая жадность искать первый selprocess=(\d+).

зы: http://www.regexe.com/

eRazor ★★★
() автор топика
Последнее исправление: eRazor (всего исправлений: 2)
Ответ на: комментарий от eRazor

Да, я немного стормозил. Надо что-то типа look ahead

$_[0] =~ m/selprocess=(\d+)(?=\>$str)/i; 

redgremlin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.