正则表达式匹配得比它应该多

时间:2014-11-12 18:39:35

标签: regex

此问题旨在成为将类似问题作为副本关闭的目标。

我写了一个似乎主要工作的正则表达式,除了它允许输入中的内容超出表达式的结尾。

正则表达式:/(\d{4})-(\d{2})-(\d{2})/

应与ISO格式的日期匹配,但它与2014-11-12345612342014-11-12匹配,甚至与a1234-56-78z之类的非数字匹配。

我做错了什么?

1 个答案:

答案 0 :(得分:-2)

正则表达式在搜索字符串中搜索模式。这意味着如果正则表达式从任何地方开始匹配,并在任何地方结束,那么它被认为是有效的。在给出的例子中:

2014-11-12345612342014-11-12a1234-56-78z都匹配其中的正则表达式。

这是正常和预期的行为。在结果集中,您将总共有四个元素:

[0]: 2014-11-12  (whole match)
[1]: 2014        (first subpattern)
[2]: 11          (second subpattern)
[3]: 12          (third subpattern)

如果要验证模式是否与整个字符串匹配,该字符串,则必须使用^(字符串开头)和$来锚定正则表达式(字符串的结尾)。你的正则表达式会变成:

/^(\d{4})-(\d{2})-(\d{2})$/

这将阻止您的任何给定示例匹配,因为它们不相应地匹配字符串开头和结尾的开头和结尾。