【问题标题】:Why doesn't this regular expression work the way I want it?为什么这个正则表达式不能按我想要的方式工作?
【发布时间】:2012-05-27 12:00:12
【问题描述】:

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

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

【问题讨论】:

  • 你想要一个只有正则表达式的解决方案还是其他也可以?
  • 我发现这个question 和这个类似。

标签: javascript regex


【解决方案1】:

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

  • [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})$

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

【讨论】:

  • 你不用转义斜线吗??
  • @David:斜线在正则表达式中没有意义。一些语言,如 JavaScript,使用正斜杠来分隔正则表达式文字,如 /'\/"/。在这些情况下,您必须在正则表达式中转义正斜杠,以便 JS 找到正则表达式的正确结尾。这是 “JavaScript 正则表达式文字” 要求。您也可以使用new Regex("'/\"")。在这里,您必须转义引号,以便 JS 可以找到字符串的正确结尾。这是“JavaScript 字符串文字” 要求。这些都与正则表达式本身无关。所以不,你不必总是逃避正斜杠。
【解决方案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';
}

【讨论】:

    【解决方案3】:
    (?<!\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,但这个似乎更规范一些。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • @David: 提示:0[1-9]|1[012] 匹配月份名称(0112
      【解决方案5】:

      试试这个

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

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

      【讨论】:

        猜你喜欢
        • 2017-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        • 1970-01-01
        • 1970-01-01
        • 2020-04-26
        • 2019-02-07
        相关资源
        最近更新 更多