与正则表达式混淆重复部分

时间:2014-03-24 13:27:52

标签: javascript regex

我对正则表达式与花括号重复部分感到困惑。请考虑以下示例:

var dateTime = /\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}/;
console.log(dateTime.test("30/1/2003 8:45"));
// true

现在如果我改变30到300000和45到455555,我会再次成真!外部数字之间的其他部分是可以的,结果是预期的。

有人可以帮我找到问题吗?

感谢。

4 个答案:

答案 0 :(得分:3)

您未匹配字符串^$)的开头和结尾,因此它只是在其中的任何位置找到匹配项 String 仍然会发生,然后给出真实。

300000/1/2003 8:455555
    dd/m/yyyy h:mm

你可能想要

/^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}$/;

或更确切地说;

/^(?:0?[1-9]|[12]\d|3[01])\/(?:0?[1-9]|1[0-2])\/\d{4} (?:0?\d|1\d|2[0-3]):[0-5]\d$/;
  • (?:pattern)非捕获组
  • pattern? n中的pattern是可选的
  • [1-9]字符类;一个从19
  • 的数字
  • pattern1|pattern2 pattern1pattern2
  • [12]字符类; 12
  • \d[0-9]
  • 相同
  • pattern{4} n pattern 4次{{1}}次

答案 1 :(得分:1)

当您将30更改为30000时,将30000的最后两个零(00)匹配,并且使用45555匹配以前两位数(45)停止,并且其余字符串不匹配。

要阻止这种情况发生,您必须指明字符串必须以指定的正则表达式开头和结尾 这可以使用anchors完成。
像这样 -

var dateTime = /^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}$/;
                ^                                     ^

答案 2 :(得分:1)

你没有匹配整个字符串,只是它的一部分 - 使用test函数,这足以返回True

请改为尝试:

/^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}$/

^锚点匹配字符串的开头,$一个匹配字符串的结尾。

答案 3 :(得分:1)

您可以使用string.match(regex)而不是regex.test(string)找到有关匹配的更多有用信息。

在这种情况下,您发现它与00/1/2003 8:45匹配,因为您没有使用^$来标记主题的开头和结尾字符串,分别为。