一个正则表达式可以实现吗?
加成
提前致谢。
答案 0 :(得分:9)
正如布莱恩所说,比较两个数字不是正则表达式的目的。如果你想检查奖金案例,你应该在正则表达式之外这样做。
/^(\d+)(?:-(\d+))?$/ && $1 < $2;
话虽如此,大多数“正则表达式”引擎实际上并不是regular,所以(例如)它可能在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
或简称/^(\d+)(?:-(\d+)(?:(?{$1>=$2})(?!)))?$/
。在Perl 5.6.1,5.8.8和5.10.0中进行了测试。
匹配extended definition of ranges建议的Lee,
/^\s*
(\d+) (?:\s*-\s* (\d+))?
(?:\s*,\s* (\d+) (?:\s*-\s* (\d+))?)*
\s*$/x
使用一些Perl 5.10功能,甚至可以确保数字排序良好:
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
答案 1 :(得分:3)
这适用于所有测试用例:
^\d+(?:-\d+)?$
编辑:除了最后一个测试用例(9-2)。检查第二个值是否大于第一个值不是正则表达式的目的。
答案 2 :(得分:3)
/^(\d+)(-(\d+))?/
如果在perl中你可以检查
if $1 <= $3
答案 3 :(得分:3)
匹配单个整数或范围,并将数字作为子匹配进行捕获以供日后使用:
/^(\d+)(?:-(\d+))?$/
答案 4 :(得分:1)
由于我是测试人员,我很高兴看到用作规范的测试用例列表。为了完整起见,我将添加以下测试用例:
此外,即使是单页或页面范围也有点简单。我会考虑支持这些额外的测试用例: