RegExp - Bash의 선택적 캡처 그룹?

RegExp - Bash의 선택적 캡처 그룹?

현재 올바른 콘텐츠를 얻기 위해 입력 파일을 구문 분석하는 일부 정규식을 작업 중입니다. 일부 입력을 구문 분석하기 위해 다음 정규식을 사용하고 있습니다.

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(?:-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD))-[a-z]

다음과 일치해야 합니다.

cell-80-sandp-sit-a

또는 이것을 일치시키십시오:

cell-80-sandp-a

-sit입력 부분은 다음과 같아야합니다.임의로 선택할 수 있는제가 이해하는 바에 따르면 그룹 캡처는 RegExp가 이 캡처 그룹을 찾을 수 없는 경우 성공적으로 계속 진행되거나 그룹을 찾으면 성공적으로 완료된다는 의미입니다.

이 예에서는 if 문에서 이를 사용하겠습니다.

if [[ "$Input" =~ $RegExp ]];
    then
        #stuff
fi

누구든지 위의 문제를 지적할 수 있습니까? 테스트용으로 사용해 봤습니다 regex101.com.

답변1

bashPCRE("Perl 호환 정규식")가 아닌 표준 확장 정규식("ERE")을 이해하세요.

귀하의 PCRE:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(?:-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD))-[a-z]

PCRE (?:...)는 비캡처 그룹(선택 그룹 아님)입니다. ERE에는 동등한 것이 없으며 모든 그룹이 캡처하고 있습니다.

표현식을 선택 사항으로 만들려면 ?아래에서 수행한 것처럼 으로 표현식을 한정할 수 있습니다. 이는 ?이전 표현식이 한 번 또는 0번 일치해야 함을 의미합니다.

ERE로:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)?-[a-z]

아니면 (SIT[a-z]|SIT[1-9])계약을 맺고 SIT[a-z1-9],

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD))?-[a-z]

여기에 앵커를 추가할 수도 있습니다.

^cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD))?-[a-z]$

...그렇지 않으면 일치할 것입니다somethingcell-...-ablahblah

답변2

(?:...)선택적 캡처 그룹이 아니라 비 캡처 그룹이며, 내가 아는 한 bash는 이를 지원하지도 않습니다. 이것은 작동합니다:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD))?-[a-z]

관련 정보