为什么这个正则表达式不能按我想要的方式工作?

时间:2012-05-27 12:00:12

标签: javascript regex

我正在尝试使正则表达式在日期字符串中找到数字(例如,04/05/1989)。这就是我所拥有的:

\A0[1-9]{2}\/0[1-9]{2}\/[1900-2012]\z

5 个答案:

答案 0 :(得分:3)

方括号创建字符范围,而不是数字范围:

  • [A-Z]匹配从AZ的所有ASCII字符。
  • [1900-2012]匹配19002之间的ASCII字符范围,{ {1}},01。实际上可以表示为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以及19之间的两位数。 [1900-2012]也不是你想要的。

答案 4 :(得分:-1)

试试这个

\A[0-9]{2}\/[0-9]{2}\/[1900-2012]\z

它应该以dd / mm / yyyy(1900年至2012年)格式匹配日期