为什么我的日期验证正则表达式不能识别二月(和其他日期)?
Why doesn't my date-validating regex recognize February (and others)?
我正在研究一个应该匹配月-日-年格里历日期的正则表达式(在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!
您的问题是'1
的反向引用。它指的是([^'dA-Za-z])
组在你的第一次轮换比赛中(31天)。要匹配第二个替代的分隔符,您需要'2
等。
所以也许你可能想使用(?:'1|'2|'3)
而不是'1
,除非在JavaScript中也会出现错误。
最后,你知道这仍然不能正确验证日期吗?
相关文章:
- 如何在Javascript中验证日期期间与其他日期期间的交叉
- 如何根据其他日期的输入更新日期
- 确定Twig(或JavaScript)中的国际日期格式,以便在其他地方使用
- 在jsp中,隐藏一个基于其他具有日期选择器的字段的字段
- 如何将日期选择器返回的日期格式转换为其他格式
- 从日期选择器中获取默认格式的日期,并在jquery UI中转换为其他格式
- 如何使用可点击按钮在Datepicker日历中选择用户在其他月份的当前日期
- 如何在 UI-日期选择器中选择日期 在其他 UI 日期选择器上
- 日期选取器问题,尝试提交除日期值之外的其他参数
- 日期格式在 Chrome 中给出的结果与其他浏览器中的结果不同
- 为什么本地化仅在单击日期或任何其他按钮后才会更改
- 将 Javascript 日期解析为 C# DateTime,FF 数据是 Chrome 日期以外的其他数据
- 在特定日期将基本图像替换为其他图像.可能
- 如何在 jquery ui 日期选取器中调整其他输入的大小
- 更改其他日期类型字段时,如何修改日期类型字段
- 当请求php脚本生成的图像时,如何使用javascript/其他方法以某种格式打印日期
- 如何将Jquery日期选择器添加到其他脚本中
- 根据日期和其他字段聚合Mongo集合中的数据,并进行计数
- 如何根据其他日期约束jQuery ui日期选择器的最小和最大日期
- 主干日期+其他参数排序