Соответствие точному количеству токенов в регулярном выражении - PullRequest
0 голосов
/ 27 февраля 2020

Я никогда не работал с регулярным выражением ...

У меня есть это регулярное выражение: LAX-Application-CustomerDrives-<environment>-<org>-<area>-<title>

Первые 3 слова, включая тире, всегда одинаковы, остальные изменяются только в что частица окружения может или не может быть там.

Теперь мне нужно установить переменную regex на LAX-Application-CustomerDrives-<env>-<org>-<area>-<title>, если окружение существует, или установить переменную regex на LAX-Application-CustomerDrives-<org>-<area>-<title>, если ее нет.

Другими словами, мне нужно 4 слова-да sh токена (UAT-<org>-<area>-<title>) в первом случае и 3 (<org>-<area>-<title>) в другом.

У меня есть это регулярное выражение в первом случае: LAX\-Application\-CustomerDrives\-([A-Z]+\-[A-Z]+\-[A-Z]+\-[A-Za-z]+), которое работает, когда есть 4 пары (при наличии среды), и не совпадает, если есть только 3, но регулярное выражение: LAX\-Application\-CustomerDrives\-([A-Z]+\-[A-Z]+\-[A-Za-z]+) будет соответствовать в любом случае.

Мне нужно явно сопоставить 4 и только 4 пары (/[A-Z]\-/g), если установлена ​​переменная среды, и 3 и только 3 пары, если не задано.

Я пробовал с LAX\-Application\-CustomerDrives\-([A-Z]+\-[A-Z]+\-[A-Za-z]+){3} и {4} но это не сработает.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Если вы хотите получить только 3 или 4 токена без начального дефиса, вы можете сопоставить дефис после 3 всегда присутствующих слов.

Затем захватите последовательность из 3 или для следующих слов в группа захвата.

\bLAX-Application-CustomerDrives-([a-zA-Z]+(?:-[a-zA-Z]+){2,3})\b

Пояснение

  • \b Граница слова, чтобы слово не входило в большее слово
  • LAX-Application-CustomerDrives- Совпадение буквально с окончанием -
  • ( Группа захвата 1
    • [a-zA-Z]+ Совпадение 1+ char a-zA-Z
    • (?:-[a-zA-Z]+){2,3} Повторите 2 или 3 раза, сопоставляя символы - и 1+ a-zA-Z
  • ) Закрыть группу
  • \b Граница слова

Regex demo


Редактировать

Если вы хотите 2 шаблона для 3 или 4 случаев, вы можете используйте (?!\S), чтобы утверждать не символ без пробелов справа.

Для 3 случаев:

\bLAX-Application-CustomerDrives-([a-zA-Z]+(?:-[a-zA-Z]+){2})(?!\S)

Regex demo

Для 4 вхождения:

\bLAX-Application-CustomerDrives-([a-zA-Z]+(?:-[a-zA-Z]+){3})(?!\S)

Regex de мо

0 голосов
/ 27 февраля 2020

Я бы предложил

LAX-Application-CustomerDrives(-[A-Z]+){3,4}

Потому что на самом деле вам нужно сопоставить 4 токена, когда есть 4 и 3 токена, когда есть 3. <env>, то есть выбор между 3 и 4, на самом деле это дополнительный токен. Вывод: сопоставьте не менее 3 значений и не более 4.

Этот тип границ является жадным: он всегда будет пытаться прочитать токен 4 раза, если это возможно.

Пример (JS ): 'LAX-Application-CustomerDrives-A-B-C-D'.match(/LAX-Application-CustomerDrives(-[A-Z]+){3,4}/) соответствует

Обратите внимание, что экранирование не обязательно ожидать в наборах символов (например, [az-]).

Обновление Теперь я лучше понимаю ваши нужно. В таком случае вам нужен отрицательный взгляд.

LAX-Application-CustomerDrives(-[A-Z]+){4} соответствует 4 токенам

LAX-Application-CustomerDrives(-[A-Z]+){3}(?!-[A-Z]+) соответствует 3 токенам и дает сбой при 4.

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