为什么我的日期验证正则表达式不能识别二月(和其他日期)?

Why doesn't my date-validating regex recognize February (and others)?

本文关键字:日期 其他 二月 识别 我的 验证 正则表达式 不能 为什么      更新时间:2023-09-26

我正在研究一个应该匹配月-日-年格里历日期的正则表达式(在javascript中),它适用于1月,3月,5月,7月,8月,10月和12月(31天的月)日期,但由于某种原因,我还没能弄清楚,它将不匹配任何其他月的任何日期。

对下面代码的一点解释:我已经将它设置为首先匹配日期的月-日部分,因此它不会匹配2月31日,例如。所以,我目前让它匹配(((31天的月)THEN(非字母数字字符,捕获)THEN(从1到31的一天))或((28天的月)THEN(非字母数字字符,捕获)THEN(从1到29的一天))或((30天的月)THEN(非字母数字字符,捕获)THEN(从1到30的一天))THEN(先前捕获的字符)THEN(过去或当前年份AD)。

我肯定问题很简单,但我就是看不出来。

^
(?:
  (?:
    (?:0?[13578]|1[02])
    ([^'dA-Za-z])
    (?:0?[1-9]|1[0-9]|2[0-9]|3[01])
  )
  |
  (?:
    (?:0?2)
    ([^'dA-Za-z])
    (?:0?[1-9]|1[0-9]|2[0-9])
  )
  |
  (?:
    (?:0?[469]|11)
    ([^'dA-Za-z])
    (?:0?[1-9]|1[0-9]|2[0-9]|30)
  )
)
'1
(?:0{0,3}[1-9]|0{0,2}[1-9][0-9]|0?[1-9][0-9]{2}|1[0-9]{3}|200[0-9]|201[01])
$

您得到这个错误是因为您使用的是'1,它不匹配最后两个选项。'1指的是第一个 ([^'dA-Za-z])——如果不匹配,就不能得到年份。

一个简单的替代方案是(?:'1|'2|'3)

另一种选择是在模式(?='d+([^'dA-Za-z]))的开头添加,并在所有地方使用'1。例如:
^
(?='d+([^'dA-Za-z]))   # capture the separator as '1
(?:
  (?:
    (?:0?[13578]|1[02])
    '1
    (?:0?[1-9]|1[0-9]|2[0-9]|3[01])
  )
  |
  (?:
    (?:0?2)
    '1
    (?:0?[1-9]|1[0-9]|2[0-9])
  )
  |
  (?:
    (?:0?[469]|11)
    '1
    (?:0?[1-9]|1[0-9]|2[0-9]|30)
  )
)
'1
(?:0{0,3}[1-9]|0{0,2}[1-9][0-9]|0?[1-9][0-9]{2}|1[0-9]{3}|200[0-9]|201[01])
$

附带说明:yikes!

尝试Datejs -一个令人印象深刻的开源JavaScript日期库。

您的问题是'1的反向引用。它指的是([^'dA-Za-z])组在你的第一次轮换比赛中(31天)。要匹配第二个替代的分隔符,您需要'2等。

所以也许你可能想使用(?:'1|'2|'3)而不是'1,除非在JavaScript中也会出现错误。

最后,你知道这仍然不能正确验证日期吗?