我正在搜索可用于测试{}括号中的数字或逗号分隔数字的正则表达式
34
{567}
{12,13,14,30,101,23}
我有以下正则表达式,它可以找到前两个例子而不是第三个例子
echo "{2424242,243,243,2,2,11}"|grep -E '^([1-9][0-9]*|\{[1-9][0-9]*\}|\{([1-9][0-9]*,)[1-9][0-9]*\})$'
出了什么问题:\{([1-9][0-9]*,)[1-9][0-9]*\}
?
答案 0 :(得分:1)
当我们最后没有逗号时,它错过了最后一个案例。它并不能解释重复。因此,在逗号后添加?
,在内部捕获组+
之后添加([1-9][0-9]*,)+
解决问题。这个也匹配最后一行:
^([1-9][0-9]*|\{[1-9][0-9]*\}|\{([1-9][0-9]*,?)+[1-9][0-9]*\})$
您可以看到live version here
顺便说一句,它可以用更短的方式编写,但我会留给你偏好。
答案 1 :(得分:1)
错误的是你没有查找重复的逗号分隔数字,你允许一个逗号并限制数字从1到9开始(如果是故意的话,请跳过这个)。我想你必须这样做:
^([0-9]+|{[0-9]+(,[0-9]+)*})$
答案 2 :(得分:0)
a=(34)
a+=( '{567}' )
a+=( '{12,13,14,30,101,23}' )
a+=( '{12,13,14,30,101,23' )
a+=( '12,13,14,30,101,23}' )
a+=( '12,13,14,30,101,23' )
regex='^([1-9][0-9]*|\{[1-9][0-9]*(,[1-9][0-9]*)*\})$'
for test in ${a[@]}; do
grep -E "$regex" <<< "$test"
done
for test in ${a[@]}; do
[[ $test =~ $regex ]] && echo ok : "$test"
done
输出:
34
{567}
{12,13,14,30,101,23}
ok : 34
ok : {567}
ok : {12,13,14,30,101,23}