=~ 연산자를 사용할 때 Bash Regex의 이상한 점

=~ 연산자를 사용할 때 Bash Regex의 이상한 점

다음 코드를 고려해보세요:

s1="1,2,3,4"; \
s2="1,2,3"; \
sP='^(([1-9][0-9]{0,},){1,2}){1,2}$'; \
[[ "${s1}," =~  $sP ]] && echo "\$s1 matches"; \
[[ "${s2}," =~  $sP ]] && echo "\$s2 matches, but why?"

두 번째 문자열이 일치하는 이유가 무엇인지 궁금합니다. 내 정규식에 결함이 있나요? 2개 또는 4개의 "요소"와 일치해야 합니다.

답변1

1개, 2개 또는 4개의 요소를 일치시키려면 ERE를 다음과 같이 수정해야 합니다.

s1="1,2,3,4" ;\
s2="1,2,3" ;\
s3="1" ;\
sP='^[1-9][0-9]{0,},$|^(([1-9][0-9]{0,},){2}){1,2}$' ;\
[[ "${s1}," =~  $sP ]] && printf "\$s1, matches\n" ;\
[[ "${s2}," =~  $sP ]] || printf "\$s2, does not match\n" ;\
[[ "${s3}," =~  $sP ]] && printf "\$s3 matches\n"

원래 ERE는 반복적으로 설명할 수 있습니다.

[1-9][0-9]{0,},1, 2, 3, 432 등과 일치합니다.

([1-9][0-9]{0,},){1,2}위에서 설명한 단일 또는 두 개의 연속 시퀀스와 일치합니다(1, 3, 1,2, 10, 10,432 등).

(([1-9][0-9]{0,},){1,2}){1,2}마지막 시퀀스 1, 1,2, 1,2,3 등이 1~2회 발생하는 것과 일치합니다.

관련 정보