我正在尝试使正则表达式在日期字符串中找到数字(例如,04/05/1989)。这就是我所拥有的:
\A0[1-9]{2}\/0[1-9]{2}\/[1900-2012]\z
答案 0 :(得分:3)
方括号创建字符范围,而不是数字范围:
[A-Z]
匹配从A
到Z
的所有ASCII字符。[1900-2012]
匹配1
,9
,0
,0
和2
之间的ASCII字符范围,{ {1}},0
和1
。实际上可以表示为2
。在字符范围表达式中,字符的顺序并不重要。 [0-29]
与[0815]
相同。因此[8510]
与[1900]
相同。
您希望[019]
与正确的年份范围匹配。或者,如果您只想匹配四位数而不想进行范围验证,则可以使用(19[0-9]{2}|200[0-9]|201[0-2])
月和日相同。您可以使用范围验证来执行此操作,也可以通过匹配一个或两个数字来执行此操作。我推荐后者。
([0-9]{4})
尝试将结果转换为日期值。如果失败,则输入无效。如果成功,请检查结果日期是否符合您的要求范围。正则表达式是提供日期有效性检查的错误工具。
答案 1 :(得分:2)
我在这里回答了类似的问题:How to parse a date in format "YYYYmmdd" in JavaScript?。它只需要在提取部分进行一些修改。
修改强> 您可以这样修改该功能:
function parse(str) { // str format: 'dd/mm/yyyy'
var d = str.substr(0,2),
m = parseInt(str.substr(3,2)) - 1,
y = str.substr(6,4);
var D = new Date(y,m,d);
return (D.getFullYear() == y && D.getMonth() == m && D.getDate() == d) ? D : 'invalid date';
}
答案 2 :(得分:0)
(?<!\d)((0?\d)|([12]\d)|(3[01]))/((0?\d)|(1[0-2]))/((19)|(20))\d\d
似乎在我做的测试中工作。
(?<!\d)((((0?\d)|([12]\d)|(3[01]))/(((0?((1[02]?)|([3578]))))|(1[0-2])))|(((0?\d)|([12]\d))/(0?2))|(((0?\d)|([12]\d)|(30))/((0?[2469])|(11))))/((19)|(20))\d\d
之前的正则表达式与31/02/2012
之类的无效日期相匹配,但这些日期似乎更具规范性。
答案 3 :(得分:-1)
恕我直言,这与有效10/10/1989
不符,但会与无效099/0991989
匹配。首先0[1-9]{2}
匹配0
以及1
和9
之间的两位数。 [1900-2012]
也不是你想要的。
答案 4 :(得分:-1)
试试这个
\A[0-9]{2}\/[0-9]{2}\/[1900-2012]\z
它应该以dd / mm / yyyy(1900年至2012年)格式匹配日期