正则表达式匹配数字,有限范围和无限范围(例如> = 9)

时间:2009-11-14 09:34:03

标签: javascript regex

以下类型的字符串

的正则表达式是什么

E.g。 1,2,3,4..5,< 6,< = 7,> 8,> = 9 这里我使用equals,range( - ),sequence(..)&大于/等于小于100的数字的运算符。这些数字用逗号分隔。

请帮我写一个正则表达式。提前谢谢。

  • 阿图尔

3 个答案:

答案 0 :(得分:3)

这样的事情怎么样:

^(\d+(-|\.\.)|[<>]=?)?\d+$

使用Python的示例:

>>> import re
>>> pattern = '^(\d+(-|\.\.)|[<>]=?)?\d+$'
>>> for s in '1, 2-3, 4..5, <6, <=7, >8, >=9'.split(','):
...     print(re.match(pattern, s.strip()).group(0))
... 
1
2-3
4..5
<6
<=7
>8
>=9

要清楚,此正则表达式仅匹配列表中的一个元素。我强烈建议您预处理您的输入,方法是将其分为逗号并修剪单个元素,就像我在上面的示例中所做的那样。即使这不是绝对必要的(你可以将这个逻辑添加到我在这里给出的正则表达式),但它会更有效和可读。

正则表达式如何运作:

  • 观察每个有效字符串以一个或多个数字结尾,即\d+$
  • 之前可能有或可能没有,^(...)?\d+$
  • 这些前缀可以是范围的开头,也可以是比较:
    • \d+(-|\.\.)匹配一个数字后跟一个或两个句号。
    • <=?匹配"<"以及"<="。同样适用于>=?。我们可以将其缩写为[<>]=?
  • 使用管道(|)组合这两个选项,表示选择,我们得到

    ^(\d+(-|\.\.)|[<>]=?)?\d+$
    

答案 1 :(得分:0)

试试这个表达式:

^(?:\d+(?:(?:\.\.|-)\d+)?|[<>]=?\d+)(?:,\s*\d+(?:(?:\.\.|-)\d+)?|[<>]=?\d+)*$

它由

的交替组成
  • \d+(?:(?:\.\.|-)\d+)?代表一个数字后跟一个范围或序列的可选表达式,
  • [<>]=?\d+了解不平等。

在第二部分中重复了这一点,并为列表添加了逗号和可选空格。

对于仅允许小于100的数字的条件,您可以将\d+替换为[1-9]\d 1..99或(?:0|[1-9]\d)替换为0..99。

答案 2 :(得分:0)

你应该完全使用正则表达式工具,如regex buddy。

您是否尝试验证字符串通常看起来像样本?

1, 2-3, 4..5, <6, <=7, >8, >=9

匹配

\s*(\d+|\d+-\d+|\d+\.\.\d+|[<>]=?\d+)\s*(,\s*(\d+|\d+-\d+|\d+\.\.\d+|[<>]=?\d+)\s*)*

分割,然后将每个部分与

匹配会更容易
\s*(\d+|\d+-\d+|\d+\.\.\d+|[<>]=?\d+)\s*

那是: 修剪的空白区域,匹配数字或数字的虚线数字,或数字点点数字,或小于或大于等于可选等于数字的数字。

你可以将其压缩到更难阅读:

\s*((\d+(-|\.\.)|[<>]=?)?\d+)\s*

如果您希望所有数字仅为1-2位数字,请将所​​有\d+更改为\d{1,2}\d\d?