匹配数字及大括号内逗号分隔数字的正则问题排查
你的正则问题分析与修正
咱们直接看你出问题的那个子正则:\{([1-9][0-9]*,)[1-9][0-9]*\},它的核心问题是只能匹配最多两个元素的大括号内容。
为什么?因为([1-9][0-9]*,)这个组只会匹配一组「正整数+逗号」,然后跟着最后一个正整数——也就是说它只能处理{12,13}这种两个元素的场景,而你第三个例子里的{12,13,14,30,101,23}有4个「数字+逗号」的组合,这个子正则根本覆盖不到。
修正思路
其实你不需要把大括号的情况拆成「单个数字」和「多个数字」两个分支,我们可以把它们合并成一个更灵活的表达式:
- 大括号内的内容:要么是单个正整数,要么是一个正整数开头,后面跟着任意次数的「逗号+正整数」
对应的正则部分就是:\{([1-9][0-9]*)(,[1-9][0-9]*)*\}
然后把整个正则整合起来,就可以覆盖你所有的测试场景:
^([1-9][0-9]*|\{([1-9][0-9]*)(,[1-9][0-9]*)*\})$
验证测试
咱们用你的例子逐一测试:
# 测试单个数字 echo "34" | grep -E '^([1-9][0-9]*|\{([1-9][0-9]*)(,[1-9][0-9]*)*\})$' # 输出:34(匹配成功) # 测试单个数字的大括号形式 echo "{567}" | grep -E '^([1-9][0-9]*|\{([1-9][0-9]*)(,[1-9][0-9]*)*\})$' # 输出:{567}(匹配成功) # 测试多个数字的大括号形式 echo "{12,13,14,30,101,23}" | grep -E '^([1-9][0-9]*|\{([1-9][0-9]*)(,[1-9][0-9]*)*\})$' # 输出:{12,13,14,30,101,23}(匹配成功)
额外说明
如果你想严格限制大括号内至少有两个数字(不过你的例子里包含单个数字的大括号,所以应该不需要),可以把后面的*改成+,也就是:\{([1-9][0-9]*)(,[1-9][0-9]*)+\},但这样就会排除{567}这种情况,根据你的需求选就行。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

