Регулярное выражение PowerShell — попытка сопоставить токены camelCase в строке

#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] . Большое спасибо за вашу помощь!