首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正则表达式以匹配单个页面或页面范围?

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

Stack Overflow用户
提问于 2009-06-10 19:23:04
回答 5查看 3.4K关注 0票数 2

嘿伙计们。我正在努力处理一个正则表达式,该表达式将与“单页/页范围”文本框中的输入匹配,这意味着用户可以输入一个整数或一个整数范围,格式较低。例如:

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

用一个正则表达式就可以了吗?

奖金

  • 9-2 :不匹配

提前谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-10 19:57:23

正如Bryan所说,比较两个数字并不是正则表达式设计要做的事情。如果希望检查奖金情况,则应在正则表达式之外进行检查。

代码语言:javascript
运行
复制
/^(\d+)(?:-(\d+))?$/ && $1 < $2;

尽管如此,大多数“正则表达式”引擎实际上并不是规则性,因此(例如)在Perl 5中是可能的:

代码语言:javascript
运行
复制
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中进行测试。

为了与范围的扩展定义匹配,建议,

代码语言:javascript
运行
复制
/^\s*
    (\d+) (?:\s*-\s* (\d+))?
    (?:\s*,\s* (\d+) (?:\s*-\s* (\d+))?)*
\s*$/x

使用一些Perl 5.10特性,甚至可以确保数字排序良好:

代码语言:javascript
运行
复制
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
票数 9
EN

Stack Overflow用户

发布于 2009-06-10 19:27:00

这适用于所有测试用例:

代码语言:javascript
运行
复制
^\d+(?:-\d+)?$

编辑:除了最后一个测试用例(9-2)。检查第二个值是否大于第一个值不是正则表达式所要做的事情。

票数 3
EN

Stack Overflow用户

发布于 2009-06-10 19:28:04

代码语言:javascript
运行
复制
/^(\d+)(-(\d+))?/

如果在perl中,您只需检查

代码语言:javascript
运行
复制
if $1 <= $3
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/977634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档