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.
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*)*
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With