开发者

Regex for ranges of values in comma-separated list

I want to write a regex that match a list of numeric values, given in a comma-separated li开发者_JS百科st, 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.


You can use the regex;

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

Regex in action


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*)*


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]+)


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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜