0

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

4

5 回答 5

3

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

  • [A-Z]A匹配从到 的所有 ASCII 字符Z
  • [1900-2012]匹配1, the 9, the , and , the , the和0之间的 ASCII 字符范围。有效地相同可以表示为。02012[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})$

尝试将结果转换为日期值。如果失败,则输入无效。如果成功,请检查结果日期是否在您所需的范围内。正则表达式是提供日期有效性检查的错误工具。

于 2012-05-27T12:13:10.947 回答
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';
}
于 2012-05-27T12:18:00.353 回答
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但这个似乎更规范一些。

于 2012-05-27T14:35:06.973 回答
-1

恕我直言,这将不匹配 valid10/10/1989但将匹配 invalid 099/0991989。首先0[1-9]{2}匹配加上和0之间的两位数。也不是你想要的。19[1900-2012]

于 2012-05-27T12:03:12.053 回答
-1

尝试这个

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

它应该匹配 dd/mm/yyyy 格式的日期(1900 到 2012)

于 2012-05-27T12:15:02.450 回答