Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Variable length lookbehind not implemented


Автор: Suppir 29.8.2011, 15:59
Код

$line = 'Маша упала со стула, а кактус - с окна';

print $1 if $line=~ /.+?(?<! со .*) с (.+)/;



Мне нужно поймать все, что находится после предлога "с",
но только в том случае, если от начала строки и до предлога "с" нет предлога "со".

Как это сделать? Регулярное выражение выдает ошибку "Variable length lookbehind not implemented".

Добавлено через 2 минуты и 45 секунд
Вариант захватить все что до предлога "с" и все что после "с", а потом анализировать отрезок до предлога - не очень удобен, потому что несколько таких проверок нужно сделать в одной регулярке. 

Автор: Pfailed 29.8.2011, 18:20
Предлагаю такой вариант
Код

print $1 if 'Маша упала со стула, а кактус - с окна' =~ /\sсо\s|\sс\s(.+)/ && defined $1;


Автор: Pfailed 29.8.2011, 19:33
Развивая мысль...
Код

print $3 if 'Маша упала со стула, а кактус - с окна' =~ /
    ^         # привязка к началу строки дабы движок не блуждал по строке пробуя разные позиции начала
    (?=       # заглянем что там первое "со" или "с"
        .*? (?: (\sсо\s) | (\sс\s) )
    )
    (?>      # идём до первого "с" без шанса на возврат
        .*?
        \sс\s
    )
    (?(2) (.+) | (<!\s)) # проверяем что захватили на момент заглядывания
                         # если "с" значит всё ок (перед "с" небыло "со"), захватываем то что после "с"
                         # а если "со" значит условие невыполняется, принудительно завершаем поиск неудачей
/x;

Вот, здесь уже не надо на defined проверять.
Хотя рекомендую всё же первый вариант, он попроще как для понимания, так и для интерпретатора.

Автор: alezzz 29.8.2011, 20:19
Цитата(Suppir @  29.8.2011,  15:59 Найти цитируемый пост)
(?<! со .*)

Цитата(Suppir @  29.8.2011,  15:59 Найти цитируемый пост)
Регулярное выражение выдает ошибку "Variable length lookbehind not implemented".

Регулярные выражения Perl не поддерживают такие конструкции, только "fixed-regexp" при просмотре назад.

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


Автор: Suppir 30.8.2011, 08:15
Спасибо за предложенные варианты, буду разбираться. На самом деле, конечно, у меня более сложное регулярное выражение; в нем нужно сделать в нескольких местах проверки вперед и назад. Уже думаю, что лучше бы, действительно, сначала резать line на отдельные части, а в них уже проводить проверки...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)