正则表达式日期匹配不起作用

时间:2011-05-20 22:28:44

标签: regex perl matching

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

/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

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

5 个答案:

答案 0 :(得分:2)

你似乎有几个问题。

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

你可能意味着

/^(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看一个更好的正则表达式和明智的话来做这样的事情一个正则表达式。

答案 1 :(得分: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建议添加括号用于分组。

答案 2 :(得分:1)

您需要对这些部分进行分组,然后摆脱^$

/(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})/

答案 3 :(得分:1)

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

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. 我避免了不必要的捕获(因为原来没有它们)。

答案 4 :(得分:0)

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

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