Bash Regex oddity ao usar o operador ~ ~

2

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

Eu estou perplexo sobre por que a segunda string é correspondida. Meu regex é falho? Supõe-se que corresponde a 2 ou 4 "elementos".

    
por user584029 17.04.2016 / 19:01

1 resposta

0

Para combinar com 1, ou 2 ou 4 elementos, o ERE deve ser modificado da seguinte forma:

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"

Seu ERE original poderia ser descrito de forma iterativa:

[1-9][0-9]{0,}, corresponde a 1 ou 2 ou 3 ou 432, etc.

([1-9][0-9]{0,},){1,2} corresponde a qualquer sequência única ou duas sequências consecutivas descritas acima: 1, ou 3, ou 1,2, ou 10, ou 10.432, etc.

(([1-9][0-9]{0,},){1,2}){1,2} corresponde a 1 ou 2 ocorrências da última sequência 1, ou 1,2, ou 1,2,3, etc.

    
por 17.04.2016 / 20:11