
考慮這段程式碼:
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 或 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、或 3、或 1,2、或 10、或 10,432 等。
(([1-9][0-9]{0,},){1,2}){1,2}
最後一個序列 1、或 1,2、或 1,2,3 等的任意 1 或 2 次符合出現。