#regex #powershell
#регулярное выражение #powershell
Вопрос:
У меня есть соглашение об именовании, основанное на следующем: тип-BusinessunitAppnameEnvironmentRole-местоположение
например: для группы ресурсов: rg-BusunitDeployTstWorkload01-ae
Количество токенов camelCase является постоянным.
Я пытаюсь создать некоторое регулярное выражение для проверки формата. Мое первое регулярное выражение:
^rg-[A-Z][a-z_0-9]{3,}[A-Z][a-z]{3}(Dev|Prd|Stg|Tst|Dr)[A-Z][a-zA-Z_0-9]{3,}(-ae|-as)$
совпадение успешно.
Однако это также соответствует случаю сбоя:
rg-BusUNITDeployTstWorkload01-ae
Если я посмотрю на $Matches, я увижу:
Name Value
---- -----
2 -ae
1 Tst
0 rg-BusUNITDeployTstWorkload01-ae
Я начал добавлять больше группировок в скобках и попытался создать некоторые другие тестовые строки, но я не чувствую, что у меня что-то получается. Например:
"^rg-([A-Z][a-z_0-9]{3,})([A-Z][a-z]{3})(Dev|Prd|Stg|Tst|Dr)[A-Z][a-zA-Z_0-9]{3,}(-ae|-as)$"
выдает
PS> $Matches
Name Value
---- -----
4 -ae
3 Tst
2 ploy
1 BusUNITDe
0 rg-BusUNITDeployTstWorkload01-ae
Я не понимаю, почему это первое совпадение является совпадением — это выглядит так:
BusUNITDe -match ([A-Z][a-z_0-9]{3,}) # is true
—> что для меня не имеет смысла.
Поиск в Интернете показывает, что это типичный подход к обработке camelCase, поэтому я не уверен, является ли это проблемой PowerShell или моим недоразумением. Мои деньги на вариант 2, но я был бы признателен, если кто-нибудь может указать мне правильное направление.
Заранее спасибо!
Комментарии:
1.
-match
не чувствителен к регистру, используйте-cmatch
2. Спасибо, это, похоже, прорыв 🙂
Ответ №1:
пожалуйста, попробуйте следующее регулярное выражение, если оно работает. Если вы можете привести больше примеров, это будет легко.
rg-([A-Z][a-z_0-9] ) [0-9] -ae
Ниже приведено описание того, как я это сделал
rg- to match first "rg-"
( group start
[A-Z] match the capital letter
[a-z_0-9] match lower case letters/digits (should be following capital letter)
) parenthesis close for group and repeat this group multiple times
[0-9]{2} followed by 2 numbers 01
-ae followed by -ae
мы можем сделать его более строгим, выполнив что-то вроде приведенного ниже:
rg-(([A-Z][a-z] ) ){4}[0-9]{2}-ae
он использует тот же принципал, но считает регистр верблюда, за которым следуют некоторые буквы 4 раза и цифра 2 раза. это зависит от того, насколько строгим вы хотите быть.
Комментарии:
1. Спасибо за ответ, да, это конкретное регулярное выражение работает (с -cmatch). Я вижу, что элемент, который мне не хватало, был » » после [a-z] . Большое спасибо за вашу помощь!