使用 =~ 运算符时 Bash Regex 的奇怪现象

使用 =~ 运算符时 Bash Regex 的奇怪现象

考虑以下代码:

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 次出现。

相关内容