RegEx - совпадение с условным поиском? - PullRequest
4 голосов
/ 23 мая 2011

Я хотел бы сопоставить часть строки, используя обходные пути, но только если другие слова не содержатся в строке.

Некоторые медведи живут и едят в лесу.

в приведенной выше строке я хотел бы найти слова "есть в" (между "живым" и "&" лесом):

/(?<=\blive and\b).*?(?=\bwoods\b)/

, но только если «медведи» не находятся за линией, ни после, ни до, ни между взглядами.

другие примеры строк, которые не должны возвращать совпадения:

Некоторые животные живут и едят в лес, как медведи.

Некоторые животные живут и едят медведей в леса.

как я могу добавить это условие к своему регулярному выражению?

Ответы [ 3 ]

4 голосов
/ 23 мая 2011

Это проблематично, потому что большинство разновидностей не поддерживают просмотр переменной длины, поэтому вы не можете проверить всю строку.Простой подход состоит в том, чтобы сопоставить всю строку вместо использования обходных путей:

^(?!.*\bbears\b).*?\blive and\b(.*?)\bwoods\b

Здесь то, что ранее было целым совпадением, является первой группой захвата.В зависимости от того, что вы используете, это может сделать замену этого текста немного менее удобной.Убедитесь, что используется флаг мультилинии (/m), а не установлен флаг одной строки (точка-все или /s).

Рабочий пример: http://rubular.com/r/TuADb2vB4w

Обратите внимание, что проблема становится очень простой, если вы можете решить ее в два этапа: отфильтровать строки с помощью \bbears\b и сопоставить искомую строку.

2 голосов
/ 23 мая 2011

В Perl:

use strict;
use warnings;

my $a = "Some bears live and eat in the woods.";

#$a = "Some animals live and eat in the woods, like bears.";

$a = "Some animals live and eat bears in the woods.";

$a =~ /(?(?!.*bears.*)(.*\blive and\b(.*)\bwoods\b.*)|(.{0}))/g;

print $2;

Условие ?(?!.*bears.*) похоже на

if the string contains the bears string
   then matches .*\blive and\b(.*)\bwoods\b.*
   else matches .{0}

Вам не нужно искать, чтобы совпадать между live and и woods

Подробнее о Условных выражениях здесь

1 голос
/ 23 мая 2011

Ваш вопрос и примеры не совпадают, но вы можете сделать что-то вроде:

(?!.*\bbears\b)(?<=\blive and\b).*?(?=\bwoods\b)

(только что расширил свое регулярное выражение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...