Merkwürdigkeit bei Bash-Regex bei Verwendung des Operators =~

Merkwürdigkeit bei Bash-Regex bei Verwendung des Operators =~

Betrachten Sie diesen Code:

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

Ich bin ratlos, warum die zweite Zeichenfolge übereinstimmt. Ist mein regulärer Ausdruck fehlerhaft? Er soll entweder mit 2 oder 4 „Elementen“ übereinstimmen.

Antwort1

Um entweder 1, 2 oder 4 Elemente abzugleichen, sollte das ERE wie folgt geändert werden:

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"

Ihr ursprüngliches ERE könnte iterativ beschrieben werden:

[1-9][0-9]{0,},entspricht 1, oder 2, oder 3, oder 432 usw.

([1-9][0-9]{0,},){1,2}stimmt mit jeder einzelnen oder zwei aufeinanderfolgenden Sequenzen der oben beschriebenen überein: 1, oder 3, oder 1,2, oder 10, oder 10.432 usw.

(([1-9][0-9]{0,},){1,2}){1,2}stimmt mit 1 oder 2 beliebigen Vorkommen der letzten Sequenz 1, oder 1,2, oder 1,2,3 usw. überein.

verwandte Informationen