Regex for ranges of values in comma-separated list

2020-07-11 07:30发布

I want to write a regex that match a list of numeric values, given in a comma-separated list, ranges allowed. Empty is not allowed.

Something like: 1-10,20-56,8,7

So far I have (([0-9]+)|([0-9]+-[0-9]+),)*[0-9]+. This does most of the job, except it misses the case of one range only (eg: 1-10 would not validate).

The checking for each range can be omitted (eg: 20-10 can be allowed as a valid range).

Any help would be appreciated.

标签: regex
4条回答
ゆ 、 Hurt°
2楼-- · 2020-07-11 08:07

Lets say that CORE of your patter is

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

It matches a single numeric value or a range. So, what you need is:

(CORE,)*CORE

And what you have is:

(CORE,)*DIGIT

Do like this and you will be fine:

(([0-9]+.)|([0-9]+-[0-9]+),)*([0-9]+.)|([0-9]+-[0-9]+)
查看更多
对你真心纯属浪费
3楼-- · 2020-07-11 08:11

I think what you were looking for is:

(CORE)(,\s+CORE)*

This will allow lists that are:

CORE CORE, CORE CORE, CORE CORE, CORE, CORE

and so on.

Hope this helps,
David

查看更多
姐就是有狂的资本
4楼-- · 2020-07-11 08:13

You can use the regex;

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

Regex in action

查看更多
贪生不怕死
5楼-- · 2020-07-11 08:13

What you're after is one (number or range) optionally followed by zero or more: comma plus (number or range):

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

This uses the \d shortcut for [0-9] and the (?: ... ) non-capturing parentheses construct.

This regex doesn't allow any spaces to be included in the list. To allow those, insert the "optional space" \s* between each term:

\s*(?:\d+(\s*-\s*\d+)?)\s*(?:,\s*(?:\d+(\s*-\s*\d+)?)\s*)*
查看更多
登录 后发表回答