Регулярное выражение не полностью соответствует желаемым образцам - PullRequest
0 голосов
/ 13 марта 2019

Я пытался написать регулярное выражение, чтобы строго соответствовать следующим шаблонам - 3+, 3 months +, 3+ months, 3m+, 3 years +, 3y+, 3+ years. Я написал шаблон - [0-9]{1,2}\s?(m|months?|y|years?)?\s?\+, который работает в большинстве случаев, за исключением 3+ months & 3+ years, здесь он соответствует только части 3+, а не части месяца. Я хочу использовать совпадающую строку где-нибудь, и это вызывает проблему. Для этого я попытался добавить другую группу, чтобы регулярное выражение выглядело как [0-9]{1,2}\s?(m|months?|y|years?)?\s?\+ (m|months?|y|years?)\s|$, но это также соответствует 6+ math. Может ли кто-нибудь помочь мне с тем, что проблема здесь, а также можно ли улучшить это регулярное выражение?

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

Спасибо

Ответы [ 3 ]

2 голосов
/ 13 марта 2019

ОБНОВЛЕНИЕ:

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

  1. Допускается только XX месяцев
  2. Разрешено только XX лет - \d{1,2}
  3. Если ## сопровождается +
    • За ним должно следовать \s*(months|years)
  4. Если за ## следует [мой]
    • За ним должно следовать \s*\+
  5. Закрой с $ 1025 *

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

Это должно быть ближе к строгому решению, которое вы ищете:

\d{1,2}\s*([my]?\+|\+?\s*(months|years)|(months|years)\s*\+?)\s*$

===========================

ОРИГИНАЛЬНАЯ ПОЧТА:

Вот первый проход в сжатой версии того, что вы хотите: \d{1,2}[\+my]?\s*(months|years)?\s*\+?

Вот пример подхода, который я выбрал:

(\d{1,2})

^ Поместите любые два числа (ваш подход в порядке, \ d означает любое число 0-9, сохраняет несколько символов)

([\+my]?\s*)

^ Символы, следующие за данным числом, могут быть m, y или +, за которыми следует любое количество пробелов.

(months|years)?

^ Мы учли все пробелы с предыдущим фрагментом регулярных выражений, поэтому давайте просто скажем, что на данный момент могут быть месяцы | годы.

(\s*\+?)

^ Последний потенциальный символ - +, но перед ним может быть несколько пробелов.

0 голосов
/ 13 марта 2019

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

\d{1,2}\+?(?:\s?(?:months?|years?|[my])\b\s?\+?)?

RegEx Demo

0 голосов
/ 13 марта 2019

Попробуйте следующее регулярное выражение

((?:\d{1,2}\+ (?:months|years))|(?:\d{1,2}\+)|(?:\d{1,2} (?:months|years) \+)|(?:\d{1,2}(?:m|y)\+))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...