Странность 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 или 2 вхождениям последней последовательности 1, или 1,2, или 1,2,3 и т. д.

Связанный контент