正则表达式以逗号分隔的列表中的值范围

时间:2010-11-30 04:08:50

标签: regex

我想编写一个匹配数字值列表的正则表达式,以逗号分隔列表给出,允许范围。不允许空。

类似于:1-10,20-56,8,7

到目前为止,我有(([0-9] +)|([0-9] + - [0-9] +),)* [0-9] +。这完成了大部分工作,除了它仅错过一个范围的情况(例如:1-10不会验证)。

可以省略对每个范围的检查(例如:允许20-10作为有效范围)。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:7)

您可以使用正则表达式;

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

Regex in action

答案 1 :(得分:1)

你所追求的是一个(数字或范围)可选地后跟零或更多:逗号加(数字或范围):

(?:\d+(?:-\d+)?)(?:,(?:\d+(-\d+)?))*

这使用[0-9]的\d快捷方式和(?: ... )非捕获括号构造。

此正则表达式不允许列表中包含任何空格。要允许这些,请在每个术语之间插入“可选空格”\s*

\s*(?:\d+(\s*-\s*\d+)?)\s*(?:,\s*(?:\d+(\s*-\s*\d+)?)\s*)*

答案 2 :(得分:0)

让我们说你的模式的核心是

([0-9]+.)|([0-9]+-[0-9]+)

匹配单个数值或范围。所以,你需要的是:

(CORE,)*CORE

你拥有的是:

(CORE,)*DIGIT

这样做,你会没事的:

(([0-9]+.)|([0-9]+-[0-9]+),)*([0-9]+.)|([0-9]+-[0-9]+)

答案 3 :(得分:0)

我认为你在寻找的是:

(CORE)(,\s+CORE)*

这将允许列表:

CORE 核心,核心 核心,核心 核心,核心,核心

等等。

希望这有帮助,
大卫