Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regex for ranges of values in comma-separated list

Tags:

regex

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.

like image 920
user524657 Avatar asked Nov 30 '10 04:11

user524657


2 Answers

You can use the regex;

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

Regex in action

like image 174
codaddict Avatar answered Sep 28 '22 07:09

codaddict


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*)*
like image 24
Adrian Pronk Avatar answered Sep 28 '22 07:09

Adrian Pronk