6

我需要一个正则表达式来匹配数字列表和另一个匹配数字范围(表达式在这两种情况下都不会失败)。范围应由一个数字、一个破折号和另一个数字 (NN) 组成,而列表应由用逗号 (N,N,N) 分隔的数字组成。下面是一些例子。

范围:

'1-10' => OK
Whateverelse => NOK (e.g. '1-10 11-20')

列表:

'1,2,3' => OK
Whateverelse => NOK

这是我的两个正则表达式:

  1. [0-9]+[\-][0-9]+
  2. ([0-9]+,?)+

...但我对他们有一些问题...例如:

评估时'1-10'正则表达式 2匹配1... 但它不应该匹配任何内容,因为字符串不包含列表。

然后,在评估时'1-10 11-14'正则表达式 1匹配1-10... 但它不应该匹配任何内容,因为字符串包含的不仅仅是一个范围。

我错过了什么?谢谢。

4

5 回答 5

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 的评论为通配符添加。

于 2013-07-19T11:44:50.083 回答
2

这个有点不同。它用于 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

于 2017-08-20T06:47:37.447 回答
1

首先,您应该使用来确保正则表达式匹配包含整个字符串,而不仅仅是一个子字符串:

^[0-9]+-[0-9]+$

然后,逗号在您的第二个正则表达式中是可选的。试试这个:

^([0-9]+,)+[0-9]+$
于 2013-07-19T11:31:55.703 回答
0

解决您的问题的最简单方法是在第二个结果周围加上一组括号:

(([0-9]+,?)+)

正如其他人所指出的那样,如果您正在接受文本输入,那么这就是您应该使用^and开始和结束的整个输入$

^(([0-9]+,?)+)$

如果您正在搜索文本正文以提取这些值,那么您将不需要它。

括号表示匹配组。如果您添加(?:到开头而不是(. 这会给你留下:

((?:[0-9]+,?)+)

这意味着唯一捕获的值是您想要的值。您也可以忽略第二次捕获。

于 2013-07-19T13:20:02.630 回答
0

我需要一些东西来匹配以逗号分隔的整数列表,例如1,2,3,4但还要指定范围,例如100-255及其组合,例如1011,1100-1300,1111,1919-9999,2111. 基本上是 OP 请求及其组合。

为此,我使用在 Regex101.com 上测试过的以下正则表达式:

^\d+((\,|-)\d+)*$

您可以将其视为:

  1. 从字符串的开头
  2. 期望 1 个或多个数字,并且...
  3. 文字逗号和 1 个或多个数字,或...
  4. 连字符和 1 个或多个数字
  5. (3) 和 (4) 重复零次或多次
  6. 直到字符串结束

这允许以下所有内容有效:

2011,2100-2300
2011,2013
1014-2024
999
1011,1100-1300,1111,1919-9999,2111

注意:/gm如果用于多行输入,则应包括全局和多行正则表达式选项

缺点是类似的东西100-100-100仍然有效,即使其他类型的更改将确保不匹配。不确定进一步解决它的复杂性,但它足以满足我的需求。

于 2022-02-09T19:10:47.693 回答