I'm trying to make the regular expression find the numbers in a date string (eg, 04/05/1989). This is what I have:
\A0[1-9]{2}\/0[1-9]{2}\/[1900-2012]\z
I'm trying to make the regular expression find the numbers in a date string (eg, 04/05/1989). This is what I have:
\A0[1-9]{2}\/0[1-9]{2}\/[1900-2012]\z
方括号创建一个字符范围,而不是数字范围:
[A-Z]
A
匹配从到 的所有 ASCII 字符Z
。[1900-2012]
匹配1
, the 9
, the , and , the , the和0
之间的 ASCII 字符范围。有效地相同可以表示为。0
2
0
1
2
[0-29]
在字符范围表达式中,字符的顺序并不重要。[0815]
是一样的[8510]
。因此[1900]
与 相同[019]
。
您想(19[0-9]{2}|200[0-9]|201[0-2])
匹配正确的年份范围。或者,如果您只想匹配四位数字而不想要范围验证,您可以使用([0-9]{4})
月日相同。您可以通过范围验证来做到这一点,也可以通过匹配一位或两位数字来做到这一点。我推荐后者。
^([0-9]{1,2})/([0-9]{2})/([0-9]{4})$
尝试将结果转换为日期值。如果失败,则输入无效。如果成功,请检查结果日期是否在您所需的范围内。正则表达式是提供日期有效性检查的错误工具。
我在这里回答了一个类似的问题: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';
}
(?<!\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
但这个似乎更规范一些。
恕我直言,这将不匹配 valid10/10/1989
但将匹配 invalid 099/0991989
。首先0[1-9]{2}
匹配加上和0
之间的两位数。也不是你想要的。1
9
[1900-2012]
尝试这个
\A[0-9]{2}\/[0-9]{2}\/[1900-2012]\z
它应该匹配 dd/mm/yyyy 格式的日期(1900 到 2012)