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?"
Estou perplexo com o motivo pelo qual a segunda corda é correspondida. Meu regex é defeituoso? É suposto combinar 2 ou 4 "elementos".
bash
regex
conditional-statements
user584029
fonte
fonte
Respostas:
Para corresponder a 1, 2 ou 4 elementos, o ERE deve ser modificado da seguinte maneira:
Seu ERE original pode ser descrito iterativamente:
[1-9][0-9]{0,},
corresponde a 1 ou 2 ou 3 ou 432 etc.([1-9][0-9]{0,},){1,2}
corresponde a uma ou duas sequências consecutivas descritas acima: 1, 3, 1,2, 10, 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.fonte
|
. No lado esquerdo, corresponde apenas a uma única sequência. No lado direito ele corresponda 2 ou 4 etc.