ОБНОВЛЕНИЕ:
Я пропустил требование строгости. Что-то, что помогает мне разобраться в этих проблемах, разбивает шаблон в виде логического дерева, например, так:
- Допускается только XX месяцев
- Разрешено только XX лет -
\d{1,2}
- Если ## сопровождается +
- За ним должно следовать
\s*(months|years)
- Если за ## следует [мой]
- За ним должно следовать
\s*\+
- Закрой с $ 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*\+?)
^ Последний потенциальный символ - +, но перед ним может быть несколько пробелов.