正则表达式匹配单个页面或页面范围?

时间:2009-06-10 19:23:04

标签: regex

嘿伙计们。我正在努力使用与“单页/页面范围”文本框中的输入匹配的正则表达式,这意味着用户可以以[lowerBound] - [upperBound]格式输入单个整数或整数范围。例如:


  • 11:匹配
  • 2:匹配
  • 2-9:匹配
  • 2a:不匹配
  • 19-:不匹配

一个正则表达式可以实现吗?

加成

  • 9-2:不匹配

提前致谢。

5 个答案:

答案 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)

由于我是测试人员,我很高兴看到用作规范的测试用例列表。为了完整起见,我将添加以下测试用例:

  • 2 - 9:匹配
  • 2- 9:匹配
  • 2 -9:匹配
  • -1-9:不匹配

此外,即使是单页或页面范围也有点简单。我会考虑支持这些额外的测试用例:

  • 1,3:匹配
  • 1-5,13:匹配
  • 1-5,13-23:匹配
  • 1,13-23:匹配