Как объединить группы в Regex с группами без захвата, чтобы иметь все необязательные - PullRequest
1 голос
/ 02 октября 2019

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

Регулярное выражение, которое я строю для решения примера :

^(\bMyCompany1\b)?(?:.+)?\s(\bestablishes\b)?(?:.+)?\s(\bAnotherCompany\b)?(?:.+)?$

Примеры предложений :

  • 'MyCompany1 establishes AnotherCompany' -соответствует всем 3 группам. ОК
  • 'MyCompany1 establ AnotherCompany' - соответствует первой и последней группе. игнорирует среднюю опечатку. тоже ок
  • 'MyCompany1 establishes AnotherCompany ' - пробел в конце. не могу определить 2 и 3 группы. Я не понимаю, почему
  • 'MyCompany1 establishes AnotherCompany' - дополнительные пробелы после слова «устанавливает». По какой-то причине больше не обнаруживает 2-ю группу

Это регулярное выражение является лишь примером одного шаблона. У меня будет 1 регулярное выражение (построить динамически) для каждого шаблона. Как и «Пользователь1 отправил запрос пользователю2», «Компания1 одолжила компании2 $ 111». Моя идея состоит в том, чтобы определить каждую часть шаблона и посмотреть, сколько частей я сопоставил. Например, в моем примере: - я ожидаю, что какое-то название компании из списка (MyCompany или MyCompany1) или группа без захвата игнорирует остальные (возможно, пользователь сделал опечатку или просто печатает и еще не закончил) - я ожидаю такой же порядок группчтобы быть там

Можете ли вы объяснить, что я делаю неправильно в моем Regex? Правильно ли достичь этого с помощью Regex?

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

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

^(?=(?:.*(\bMyCompany1\b))?)(?=(?:.*?(\bestablishes\b))?)(?=(?:.*(\bAnotherCompany\b))?).*$

Вы получите объяснение регулярного выражения по ссылке ниже:

Демо

Или, если заказ имеет значение:

^(?:.*(\bMyCompany1\b))?(?:.*?(\bestablishes\b))?(?:.*(\bAnotherCompany\b))?.*$

Демо

0 голосов
/ 02 октября 2019

Не могли бы вы попробовать ниже регулярное выражение

^ (\ bMyCompany1 \ b)? \ S + (\ bestablishes \ b)? \ S + (\ bAnotherCompany \ b)? (?:. +)? $

надеюсь, это поможет

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