Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Variable length lookbehind not implemented 
:(
    Опции темы
Suppir
Дата 29.8.2011, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Код

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

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



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

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

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

Это сообщение отредактировал(а) Suppir - 29.8.2011, 15:59
PM MAIL   Вверх
Pfailed
Дата 29.8.2011, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Предлагаю такой вариант
Код

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



Это сообщение отредактировал(а) Pfailed - 29.8.2011, 18:42


--------------------
PM MAIL   Вверх
Pfailed
Дата 29.8.2011, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Развивая мысль...
Код

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

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



--------------------
PM MAIL   Вверх
alezzz
Дата 29.8.2011, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



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

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

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

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


PM MAIL   Вверх
Suppir
Дата 30.8.2011, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Спасибо за предложенные варианты, буду разбираться. На самом деле, конечно, у меня более сложное регулярное выражение; в нем нужно сделать в нескольких местах проверки вперед и назад. Уже думаю, что лучше бы, действительно, сначала резать line на отдельные части, а в них уже проводить проверки...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.