регулярное выражение отрицательный взгляд - PullRequest
0 голосов
/ 27 сентября 2019

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

you.{0,50}(?<!not)\s?special

в следующем списке строк

to include:
youaresospecial
you are so special
you are pretty special
you are special
youarespecial
you are sospecial
you are very special
you are super special
you are special
you special
you aresospecial

to exclude:
youarenotspecial
you are not special
youarenotspecial

соответствует всемстроки, которые мне нужно включить, но также выделяет одну из строк, которые я хотел бы исключить («Вы не особенный»)

проверял это на https://regex101.com/r/KTsjn8/1

кто-то может указать, почему?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Чтобы объяснить, почему ваше регулярное выражение терпит неудачу:

Взять you are not special.

  • you.{0,50} соответствует you are not (обратите внимание на пробел)
  • (?<!not) соответствует, потому что not не является not
  • \s? соответствует, потому что это необязательно
  • special соответствует.

Чтобы исправить это, вы можетевместо этого используйте отрицательный прогноз:

you(?!.*not\s?special).{0,50}special
0 голосов
/ 27 сентября 2019

Ваше регулярное выражение не работает, потому что \s? позволяет шаблону соответствовать позиции нулевой ширины за special, а затем успешно утверждает в этой позиции, что за ним нет not с (?<!not).

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

you.{0,50}(?<!not\s)(?<!not)special

Демонстрация: https://regex101.com/r/KTsjn8/2

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