括号中的逗号分隔数字的正则表达式

时间:2018-04-07 16:22:04

标签: regex bash

我正在搜索可用于测试{}括号中的数字或逗号分隔数字的正则表达式

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]*\}

3 个答案:

答案 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}