【发布时间】:2012-05-27 12:00:12
【问题描述】:
我试图让正则表达式在日期字符串中找到数字(例如,04/05/1989)。这就是我所拥有的:
\A0[1-9]{2}\/0[1-9]{2}\/[1900-2012]\z
【问题讨论】:
-
你想要一个只有正则表达式的解决方案还是其他也可以?
-
我发现这个question 和这个类似。
标签: javascript regex
我试图让正则表达式在日期字符串中找到数字(例如,04/05/1989)。这就是我所拥有的:
\A0[1-9]{2}\/0[1-9]{2}\/[1900-2012]\z
【问题讨论】:
标签: javascript regex
方括号创建一个字符范围,而不是数字范围:
[A-Z] 匹配从 A 到 Z 的所有 ASCII 字符。[1900-2012] 匹配 1、9、0、0 和 2 之间的 ASCII 字符范围、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})$
尝试将结果转换为日期值。如果失败,则输入无效。如果成功,请检查结果日期是否在您所需的范围内。正则表达式是提供日期有效性检查的错误工具。
【讨论】:
/'\/"/。在这些情况下,您必须在正则表达式中转义正斜杠,以便 JS 找到正则表达式的正确结尾。这是 “JavaScript 正则表达式文字” 要求。您也可以使用new Regex("'/\"")。在这里,您必须转义引号,以便 JS 可以找到字符串的正确结尾。这是“JavaScript 字符串文字” 要求。这些都与正则表达式本身无关。所以不,你不必总是逃避正斜杠。
我在这里回答了一个类似的问题: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,但这个似乎更规范一些。
【讨论】:
恕我直言,这不会匹配有效的10/10/1989,但会匹配无效的099/0991989。首先0[1-9]{2} 匹配0 加上1 和9 之间的两位数。 [1900-2012] 也不是你想要的。
【讨论】:
0[1-9]|1[012] 匹配月份名称(01 到 12)
试试这个
\A[0-9]{2}\/[0-9]{2}\/[1900-2012]\z
它应该匹配 dd/mm/yyyy(1900 到 2012) 格式的日期
【讨论】: