我对正则表达式与花括号重复部分感到困惑。请考虑以下示例:
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,我会再次成真!外部数字之间的其他部分是可以的,结果是预期的。
有人可以帮我找到问题吗?
感谢。
答案 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]
字符类;一个从1
到9
pattern1|pattern2
pattern1
或pattern2
[12]
字符类; 1
或2
\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
匹配,因为您没有使用^
和$
来标记主题的开头和结尾字符串,分别为。