
次のコードを考えてみましょう:
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 回の出現に一致します。