首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改数字和数值范围表达式列表的正则表达式

修改数字和数值范围表达式列表的正则表达式
EN

Stack Overflow用户
提问于 2009-11-16 18:11:23
回答 2查看 1.3K关注 0票数 1

我正在使用ExtJS。使用ExtJS组件生成的textfield之一应该允许逗号分隔的数字/操作字符串(3个类似的示例),如

代码语言:javascript
复制
1, 2-3, 4..5, <6, <=7, >8, >=9 
>2, 3..5, >=9,>10
<=9, 1, <=8, 4..5, 8-9

这里我使用等于、范围(-)、序列(.)&小于或等于100的数字大于/等于运算符。这些数字用逗号隔开。

这种类型的字符串的正则表达式可以是什么?

为了我以前问的问题..。我从“dlamblin”中得到了一个解决方案:^(?:\d+(?:(?:\.\.|-)\d+)?|[<>]=?\d+)(?:,\s*\d+(?:(?:\.\.|-)\d+)?|[<>]=?\d+)*$

这对于所有模式都是完美的,除了:

  1. 只有当关系运算符(<<=>>=)作为字符串的第一个元素存在时才会出现。例如,<=3, 4-5, 6, 7..8工作得很好,但是<=3, 4-5, 6, 7..8, >=5关系运算符不是字符串的第一个元素。<4.
  2. Numbers
  3. <3<4, 5, 9-4也没有给出任何错误,即它满足条件,尽管字符串中的<3<3之间需要逗号,但应该小于或等于100。也就是说,99..100
  4. It,<1000-100不应该允许前导零(如003099)

)

EN

回答 2

Stack Overflow用户

发布于 2009-11-16 18:44:05

使用令牌程序的Welbog's advice是明智的选项。

如果您有强制使用正则表达式的其他约束,则可以使用

代码语言:javascript
复制
^(<|<=|>|>=)?\s*(100|0|[1-9]\d?)((\.\.|-)(100|0|[1-9]\d?))?(,\s*(<|<=|>|>=)?\s*(100|0|[1-9]\d?)((\.\.|-)(100|0|[1-9]\d?))?)*$

这是手动展开以下内容的结果:

代码语言:javascript
复制
num   = (100|0|[1-9]\d?)
op    = (<|<=|>|>=)
range = op?\s*num((\.\.|-)num)?
expr  = ^range(,\s*range)*$
票数 2
EN

Stack Overflow用户

发布于 2009-11-16 18:51:39

这应该是可行的:

代码语言:javascript
复制
^(?:(?:\s*((?:\<|\>|\<\=|\>\=)?(?:[1-9]|[1-9]\d|100))\s*(?:,|$))|(?:\s*((?:[1-9]|[1-9]\d|100)(?:\.\.|\-)(?:[1-9]|[1-9]\d|100))\s*(?:,|$)))*$

(显然,您需要使用"multiline“选项。)

如果您有regex引擎支持“忽略空白”选项的优势,那么您可以这样拆分它:

代码语言:javascript
复制
^                           # beginning of line
(?:   
  (?:
    \s*                     # any whitespace
    (                       # capture group
      (?:<|>|<=|>=)?        # inequality
      (?:[1-9]|[1-9]\d|100) # single value
    )
    \s*                     # any whitespace
    (?:,|$)                 # comma or end of line
  )
  |
  (?:
    \s*                     # any whitespace
    (                       # catpure group
      (?:[1-9]|[1-9]\d|100) # single value
      (?:\.\.|\-)           # range modifier
      (?:[1-9]|[1-9]\d|100) # single value
    )
    \s*                     # any whitespace
    (?:,|$)                 # comma or end of line
  )
)+                          # one or more of all this
$                           # end of line

如您所见,它与Expresso中的示例相匹配:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1743883

复制
相关文章

相似问题

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