RegEx for value范围从1到365

时间:2010-12-09 07:19:06

标签: regex

值范围从1到365

的RegEx是多少

8 个答案:

答案 0 :(得分:6)

您必须列出可能的组合1-9,10-99,100-299,300-359,360-365:

^([1-9]\d?|[12]\d\d|3[0-5]\d|36[0-5])$

答案 1 :(得分:5)

试试这个:

^(?:[1-9]\d?|[12]\d{2}|3[0-5]\d|36[0-5])$
  • 开始锚点^和结束锚点 $将匹配整个输入和 不仅仅是其中的一部分。
  • (? )用于分组。
  • |用于替换
  • [1-9]\d?199
  • 相匹配
  • [12]\d{2}100299
  • 相匹配
  • 3[0-5]\d300359
  • 相匹配
  • 36 [0-5]将360365
  • 相匹配

答案 2 :(得分:3)

不太适合正则表达式,但如果你坚持:

^(?:36[0-5]|3[0-5][0-9]|[12][0-9][0-9]|[1-9][0-9]|[1-9])$

这不允许前导零。如果你想允许这些,请告诉我。

上面的表达可以稍微缩短到

^(?:36[0-5]|3[0-5]\d|[12]\d{2}|[1-9]\d?)$

但我发现第一个解决方案更具可读性。 YMMV。

答案 3 :(得分:1)

匹配1到XYZ

之间数字的一般解决方案
^(?!0)(?!\d{4}$)(?![X+1-9]\d{2}$)(?!X[Y+1-9]\d$)(?!XY[Z+1-9]$)\d+$

注意:

  1. 如果X,Y或Z中的任何一个为9将使X + 1等为10.如果发生这种情况,则应该省略使用10的正则表达式部分。
  2. 这可以扩展到具有更多或更少数字的数字遵循相同的原则。
  3. 它不允许左填充0。
  4. 适用于您的案件:

    ^(?!0)(?!\d{4}$)(?![4-9]\d{2}$)(?!3[7-9]\d$)(?!36[6-9]$)\d+$
    

    让我们解释一下:

    (?!0\d*) - does not start with 0
    (?!\d{4}$) - does not have 4 digits, i.e. between 1000 and infinity
    (?![4-9]\d{2}$) - it's not between 400 and 999
    (?!3[7-9]\d$) - it's not between 370 and 399
    (?!36[6-9]$) - it's not between 366 and 369
    

    Test it.

答案 4 :(得分:0)

^3(6[0-5]|[0-5]\d)|[12]\d\d|[1-9]\d|[1-9]$

或者如果05之类的数字无法输入:

^3(6[0-5]|[0-5]\d)|[12]?\d?\d$

P.S。:无论如何不需要正则表达式。使用ToInt(),< =,> =

答案 5 :(得分:0)

^36[0-5]|(3[0-5]|[12]?[0-9])[0-9]$

答案 6 :(得分:0)

这实际上取决于你的正则表达式引擎,因为它们可能并非都是PCRE风格的。除非我知道它将针对最小引擎,否则我通常会使用最低公分母。

为此,我只想使用:

^[1-9]|[1-9][0-9]|[1-2][0-9]{2}|3[0-5][0-9]|36[0-5]$

这将照顾(按顺序):

  • 1-9
  • 10-99
  • 100-299
  • 300-359
  • 360-365

但是,除非你完全要求只使用正则表达式,否则我不会。这就像试图用热核弹头杀死苍蝇一样。

只需使用更简单的^[0-9]{1,3}$,然后使用您拥有的任何语言功能将其转换为整数并检查它是否介于1和365之间:

def isValidDayOtherThanLeapYear (s):
    if not s.matches ("^[0-9]{1,3}$"):
        return false
    n = s.toInteger()
    if n < 1 or n > 365:
        return false
    return true

你的代码会更具可读性,我倾向于重新考虑正则表达式的使用,他们开始看起来就像在轨道上六个月难以阅读一样。

答案 7 :(得分:-1)

这对我有用......

^ [1-3] [0-6] [0-5]?$