我需要一个正则表达式匹配数字列表和另一个匹配数字范围(表达式在这两种情况下都不会失败)。范围应由数字,短划线和另一个数字(N-N)组成,而列表应由逗号(N,N,N)分隔的数字组成。以下是一些例子。
范围:
'1-10' => OK
Whateverelse => NOK (e.g. '1-10 11-20')
列表:
'1,2,3' => OK
Whateverelse => NOK
这是我的两个正则表达式:
...但我有一些问题...例如:
评估'1-10'
时, 正则表达式2 匹配1
...但它不应匹配任何内容,因为该字符串不包含列表。
然后,在评估'1-10 11-14'
时, 正则表达式1 匹配1-10
...但它不应匹配任何内容,因为字符串包含更多内容而不只是一个范围。
我错过了什么?感谢。
答案 0 :(得分:5)
试试这个:
^((\d+-(\*|\d+))|((\*|\d+)-\d+)|((\d)(,\d)+))$
测试结果:
1-10 OK
1,2,3 OK
1-* OK
*-10 OK
1,2,3 1-10 NOK
1,2,3 2,3,4 NOK
*-* NOK
正则表达式的可视化:
编辑:根据OP的评论添加了通配符*
。
答案 1 :(得分:1)
首先,您应该使用anchors来确保正则表达式匹配包含整个字符串而不仅仅是子字符串:
^[0-9]+-[0-9]+$
然后,逗号在第二个正则表达式中是可选的。试试这个:
^([0-9]+,)+[0-9]+$
答案 2 :(得分:1)
这个有点不同。它适用于Procurve交换机上的端口
^(((\d+)|(\d+-\d+))(,((\d+)|(\d+-\d+)))*)$
它在perl中。
1 OK
2 OK
3 OK
1-4 OK
0-A NOK
83-91 OK
14,15,16 OK
14,20-25,91 OK
a,b-c,5,5,5 NOK
this-is,5,7,9 NOK
9,8,1-2,1-7 OK
我没有包含上面的*
。你(@unlimit)用什么用于那个精彩的图表?
-E
答案 3 :(得分:0)
对您的问题最简单的解决方案是在第二个结果周围包含一组额外的括号:
(([0-9]+,?)+)
正如其他人已经注意到,如果你正在进行文字输入,那就是整个输入,你应该用^
和$
开始并完成它:
^(([0-9]+,?)+)$
如果您正在搜索文本正文以提取这些值,那么您将不需要它。
括号表示匹配组。如果您将(?:
添加到开头而不是(
,也可以将内部括号标记为“非捕获组”。这会让你:
((?:[0-9]+,?)+)
这意味着唯一捕获的值是您想要的值。你也可以忽略第二次捕获。