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

Why doesn't this regular expression work the way I want it?

本文关键字:我想要 方式 工作 不能按 正则表达式 为什么      更新时间:2023-09-26

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

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

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

  • [A-Z]匹配从 AZ 的所有 ASCII 字符。
  • [1900-2012]匹配19002之间的ASCII字符范围、012。实际上,相同的可以表示为[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})$

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

我在这里回答了一个类似的问题:如何在JavaScript中解析格式为"YYYYmmdd"的日期?它只需要在提取部分进行一些修改。

编辑:您可以通过以下方式修改该函数:

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加上19之间的两位数。另外[1900-2012]也不是你想要的。

试试这个

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

它应以 DD/MM/YYYY(1900 到 2012 年)格式匹配日期