=~ 演算子を使用した場合の Bash 正規表現の異常

=~ 演算子を使用した場合の Bash 正規表現の異常

次のコードを考えてみましょう:

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 番目の文字列が一致する理由がわかりません。正規表現に欠陥があるのでしょうか? 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 つまたは 2 つの連続するシーケンスと一致します: 1、3、1,2、10、10,432 など。

(([1-9][0-9]{0,},){1,2}){1,2}最後のシーケンス 1、1,2、1,2,3 などの 1 回または 2 回の出現に一致します。

関連情報