Wie Bryan sagt, dass der Vergleich zweier Zahlen nicht etwas ist, für das reguläre Ausdrücke gedacht sind. Wenn Sie nach dem Bonus-Fall suchen möchten, sollten Sie dies außerhalb des regulären Ausdrucks tun.
/^(\d+)(?:-(\d+))?$/ && $1 < $2;
aber sagen, dass die meisten "reguläre Ausdrücke" Motoren sind nicht wirklich regular, so (zum Beispiel) ist es möglich, 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
Oder /^(\d+)(?:-(\d+)(?:(?{$1>=$2})(?!)))?$/
kurz. Getestet in Perl 5.6.1, 5.8.8 und 5.10.0.
Passend der extended definition of ranges dass Lee schon sagt,
/^\s*
(\d+) (?:\s*-\s* (\d+))?
(?:\s*,\s* (\d+) (?:\s*-\s* (\d+))?)*
\s*$/x
einige Perl 5.10 Funktionen verwenden, ist es sogar möglich ist, um sicherzustellen, dass die Zahlen gut bestellt:
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
Warum sagen Leute nun, dass Regexes nicht lesbar sind? Das sagt deutlich "Aardvarks sind schmackhaft" in Martian. –
Ich habe vergessen zu schreiben, dass die erste Option viel besser ist als die zweite - ich werde es hier in diesem Kommentar sagen. Die zweite Option ist jedoch gut lesbar, wenn sie gut eingerückt und kommentiert ist. Die komprimierte Version ist nicht lesbar, aber auch viele Einzeiler in jeder Sprache./x ist ein guter Stil: In der Tat glaube ich, dass Perl 6 Regeln (Name gewählt als "regex" ist nicht mehr wirklich genau) sind/x standardmäßig. – ephemient
Während ich glaube/x in Perl entstanden ist, hat Ruby das gleiche, Python hat re.X = re.VERBOSE, Java hat java.util.regex.Pattern.COMMENTS, .NET hat System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace, und so weiter. Ich weiß nicht, warum diese Funktion nicht so oft gelobt wird wie sie sein sollte. – ephemient