Ruby regex: «захватывать строку, если за ней не следует ...» - PullRequest
6 голосов
/ 26 января 2011

Мое регулярное выражение захватывает цитируемые фразы:

"([^"]*)"

Я хочу улучшить его, игнорируя кавычки, за которыми следуют ', -' (запятая, пробел и тире в этом конкретном порядке).

Как мне это сделать?

Тест: http://rubular.com/r/xls6vN1w92

Ответы [ 4 ]

4 голосов
/ 26 января 2011

Это следует сделать, используя Negative Lookahead :

"(?!, -)([^"]*)"(?!, -)

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

http://rubular.com/r/yFMyUKJOHL

1 голос
/ 26 января 2011

Это непонятно в вашем контексте, его открытый конец.Единственный способ разобрать это - потреблять не так, как и хот, но это все еще недопустимая предпосылка.

/"([^"]*?)"(?!, -)|"[^"]*?"(?=, -)/

Затем проверять группу захвата 1 в каждом матче, что-токак это:

$rx = qr/"([^"]*?)"(?!, -)|"[^"]*?"(?=, -)/;
while (' "ingnore me", - "but not me" ' =~ /$rx/g) {
  print "'$1'\n" if defined $1
}
1 голос
/ 26 января 2011

Regex

"(.*?)"(?!, -)

Рабочий пример

http://rubular.com/r/9kOmZLxLfy

0 голосов
/ 26 января 2011

Добавьте (?!...) в конце регулярного выражения:

"([^"\n]*)"(?!, -)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...