2016-03-14 6 views
1

Давайте предположим, что я хочу, чтобы соответствовать слово «кошка», но перед этим словом не должно быть слово «мышь» на одной и той же линииRegex - отключить конкретные подстроки той же линии

Сопрягано:

Hello, cat! 

Сопрягано

Hello, mouse! 
Hello, cat! 

Не соответствует

Hello, mouse and cat 

Но он должен обрабатывать любые строки правильно, например, только «кошка» также должна быть сопоставлена. У меня есть регулярное выражение, которое не работает

(?!\bmouse\b)[^\n]*cat 

мая кто-то помочь, пожалуйста? Благодаря

+1

Какой аромат/язык регулярных выражений с помощью? – anubhava

+0

Я думаю, вы можете попробовать ['^ (?!. * \ Bmouse \ b. * \ Bcat \ b). *'] (Https://regex101.com/r/hU6kV9/1). Однако это будет соответствовать всей строке. Вам понадобится бесконечная ширина отрицательного lookbehind, чтобы соответствовать только 'cat', которому не предшествует« мышь ». И это зависит от того, какую библиотеку регулярных выражений вы используете. См. ['(?

+0

@anubhava, java.util.regex – Ivan

ответ

1

проводок, так как мой ответ в комментариях работал для вас.

Вы можете использовать ограниченный по ширине (один просмотр назад с предельным квантификатором):

"(?<!\\bmouse\\b.{0,1000})\\bcat\\b" 

Так как минимальные и максимальные пределы известны, двигатель знает возможную длину шаблона просмотра назад.

См пробивного regex demo

Узор:

  • (?<!\\bmouse\\b.{0,1000}) - проверить, есть ли целое слово mouse перед тем текущее положение отделенного от 0 до 1000 любых символов, кроме символа новой строки
  • \\bcat\\b - целое слово cat
0

Попробуйте это регулярное выражение с отрицательным предпросмотром:

^(?!.*?\bmouse\b.*\bcat\b).* 

(?!.*?\bmouse\b.*\bcat\b) отрицательный предпросмотр утверждать неудачу, когда mouse присутствует перед тем cat в одной строке. \b используется для утверждения границы слова.

RegEx Demo

Смежные вопросы