As Bryan says, comparing two numbers is not something regular expressions are designed to do. If you wish to check for the bonus case, you should do so outside the regular expression.
/^(\d+)(?:-(\d+))?$/ && $1 < $2;
That being said, most "regular expression" engines aren't actually regular, so (for example) it is possible in Perl 5:
m{ # /../ is shorthand for m/../
\A # beginning of string
(\d+) # first number
(?:- # a non-capturing group starting with '-'...
(\d+) # second number
(?(?{$1>=$2}) # if first number is >= second number
(?!)) # fail this match
)? # ...this group is optional
\Z # end of string
}x # /x tells Perl to allow spaces and comments inside regex
Or /^(\d+)(?:-(\d+)(?:(?{$1>=$2})(?!)))?$/
for short. Tested in Perl 5.6.1, 5.8.8, and 5.10.0.
To match the extended definition of ranges that Lee suggests,
/^\s*
(\d+) (?:\s*-\s* (\d+))?
(?:\s*,\s* (\d+) (?:\s*-\s* (\d+))?)*
\s*$/x
Using some Perl 5.10 features, it is even possible to ensure that the numbers are well-ordered:
m{
\A\s* # start of string, spaces
(?{{$min = 0}}) # initialize min := 0
(?&RANGE) (?:\s*,\s* (?&RANGE))* # a range, many (comma, range)
\s*\Z # spaces, end of string
(?(DEFINE) # define the named groups:
(?<NUMBER> # number :=
(\d*) # a sequence of digits
(?(?{$min < $^N}) # if this number is greater than min
(?{{$min = $^N}}) # then update min
| (?!))) # else fail
(?<RANGE> # range :=
(?&NUMBER) # a number
(?:\s*-\s* (?&NUMBER))?)) # maybe a hyphen and another number
}x