Rareza de Bash Regex cuando se usa el operador =~

Rareza de Bash Regex cuando se usa el operador =~

Considere este código:

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?"

No sé por qué coincide la segunda cadena. ¿Mi expresión regular es defectuosa? Se supone que debe coincidir con 2 o 4 "elementos".

Respuesta1

Para que coincida con 1, 2 o 4 elementos, el ERE debe modificarse de la siguiente manera:

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"

Su ERE original podría describirse de forma iterativa:

[1-9][0-9]{0,},coincide con 1, 2, 3, 432, etc.

([1-9][0-9]{0,},){1,2}coincide con cualquier secuencia consecutiva o dos descritas anteriormente: 1, 3, 1, 2, 10, 10,432, etc.

(([1-9][0-9]{0,},){1,2}){1,2}coincide con 1 o 2 apariciones de la última secuencia 1, o 1,2, o 1,2,3, etc.

información relacionada