【问题标题】:Regex date matching not working正则表达式日期匹配不起作用
【发布时间】:2011-05-20 22:28:44
【问题描述】:

我的正则表达式有问题。在这里。

/0[1-9]|1[0-2]|^[1-9]{1}$\/^[1-9]{1}$|0[1-9]|[1-2]\d|3[0-1]\/19\d{2}|20\d{2}/

它不应该匹配这个日期,

1/32/2006

但由于某种原因它是匹配的,你能告诉我我做错了什么吗?

【问题讨论】:

  • 对于正则表达式,通常最好告诉我们您要匹配的条件

标签: regex perl matching


【解决方案1】:

你似乎有几个问题。

正则表达式在您列出的第一个替代方案中匹配“06”(从 2006 年开始)“0[1-9]”

你可能是说

/^(0[1-9]|1[0-2]|^[1-9]{1})\/([1-9]{1}|0[1-9]|[1-2]\d|3[0-1])\/(19\d{2}|20\d{2})$/

或类似的东西(我还没有测试过那个正则表达式,它可能还有其他问题),但你真的应该看看Regular Expression to match a valid day in a date 以了解一个更好的正则表达式和关于在正则表达式中做这样的事情的聪明人的话.

【讨论】:

    【解决方案2】:

    这很有趣:

    ^[1-9]{1}$
    

    您似乎正在使用它来匹配一个没有在另一个数字之前或之后的数字。那是行不通的。 ^$ 将匹配锚定到字符串的开头和结尾,{1} 什么都不做。

    如果你想允许一个带有可选前导零的数字,使用这个:

    0?[1-9]
    

    完整的正则表达式将是:

    (?:1[02]|0?[1-9])\/(?:3[01]|[12]\d|0?[1-9])\/(?:19\d{2}|20\d{2})
    

    按照@Seth 的建议,我还为分组添加了括号。

    【讨论】:

      【解决方案3】:

      您需要对这些部分进行分组并去掉^$

      /(0[1-9]|1[0-2]|[1-9]{1})\/([1-9]{1}|0[1-9]|[1-2]\d|3[0-1])\/((19|20)\d{2})/
      

      【讨论】:

      • 看起来赛斯更新他的答案比我写(和测试)我的更快。 :-)
      【解决方案4】:

      即使有所有的间距和更好的分隔符,

      m{
          ^
          (?: 0[1-9] | 1[0-2]? | [2-9] )
          /
          (?: 0[1-9] | 1[0-9]? | 2[0-9]? | 3[0-1]? | [4-9] )
          /
          (?: (?:19|20)[0-9]{2} )
          \z
      }x
      

      可读性不如

      m{ ^ ([0-9]{1,2}) / ([0-9]{1,2}) / ([0-9]{4}) \z }x
          && $1 >=    1 && $1 <=   12
          && $2 >=    1 && $2 <=   31
          && $3 >= 1900 && $3 <= 2099
      

      我已经应用了一些修复:

      1. \d 不等于 [0-9]
      2. $ 允许换行。
      3. 我避免了不必要的捕获(因为原版没有)。

      【讨论】:

        【解决方案5】:

        对匹配日期here 的正则表达式有一个很好的概述。特别是,它列出了匹配 MM/DD/YYYY 日期的正则表达式:

        ^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$
        

        【讨论】:

          猜你喜欢
          • 2011-08-24
          • 1970-01-01
          • 1970-01-01
          • 2011-06-10
          • 1970-01-01
          • 1970-01-01
          • 2014-09-03
          • 1970-01-01
          相关资源
          最近更新 更多