Регулярные выражения не совпадают с разрывами предложений - PullRequest
2 голосов
/ 23 апреля 2019

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

(?:sandwich|toastie).{0,100}(ham|cheese|pickle)

Что будет соответствовать что-то вроде Andy sat down to enjoy his sandwich which, unusally for him, was filled with delicious ham

Однако это также охватывало бы «разрывы контекста», такие как пунктуация в конце предложения или разрывы строк, например Victorians enjoyed a good sandwich after work. They also enjoyed cheese rolling.. В этом контексте я хотел бы отменить совпадение, поскольку оно пересекает предложение.

Итак, я попытался сделать (?:sandwich|toastie)(?:\w\. ){0}.{0,100}(ham|cheese|pickle), но это не сработало. Я представляю себе что-то вроде [^\w\. ], но это тоже неправильно

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

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

(?:sandwich|toastie)(?:(?!(?:ham|cheese|pickle|\w\. +|(?:\r?\n|\r))).){1,100}(?:ham|cheese|pickle)

Пояснение

  • (?:sandwich|toastie) Соответствует одному из вариантов
  • (?: Группа без захвата
    • (?! Отрицательный прогноз для предотвращения чрезмерного соответствия, утверждайте, что ниже не
      • (?:ham|cheese|pickle|\w\. |(?:\r?\n|\r)) Соответствует любому из параметров
    • ). Закройте отрицательный прогноз и соответствуетлюбой символ
  • ){1,100} Закройте группу без захвата и повторите 1 - 100 раз
  • (?:ham|cheese|pickle) соответствует одному из вариантов

Regex demo

Возможно, вы захотите использовать границы слов \b для \b(?:sandwich|toastie)\b и \b(?:ham|cheese|pickle)\b, чтобы слова не входили в большее слово.

1 голос
/ 23 апреля 2019

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

(?:sandwich|toastie)(?:(?!\w\. ).){0,100}(ham|cheese|pickle)

Regex Demo

В общем, когда вы пытались свести на нет шаблон (?:\w\. ), чтобы совпадение не удалось, вам нужно написать (?:(?!\w\. ).) вместо простого ., что не соответствовало бы совпадению, и слова из этих двух скобок не будут совпадать через два разных предложения.

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