Javascript正则表达式直到字符串结尾才匹配

Javascript正则表达式直到字符串结尾才匹配,javascript,regex,Javascript,Regex,我正在用javascript中的正则表达式验证日期。我使用的正则表达式是 /^(((((0?[1-9])|(1\d)|(2[0-8]))\/((0?[1-9])|(1[0-2])))|((31\/((0?[13578])|(1[02])))|((29|30)\/((0?[1,3-9])|(1[0-2])))))\/((20[0-9][0-9])|(19[0-9][0-9])))|((29\/02\/(19|20)(([02468][048])|([13579][26]))))$/ 这会精确匹配

我正在用javascript中的正则表达式验证日期。我使用的正则表达式是

/^(((((0?[1-9])|(1\d)|(2[0-8]))\/((0?[1-9])|(1[0-2])))|((31\/((0?[13578])|(1[02])))|((29|30)\/((0?[1,3-9])|(1[0-2])))))\/((20[0-9][0-9])|(19[0-9][0-9])))|((29\/02\/(19|20)(([02468][048])|([13579][26]))))$/
这会精确匹配日期,但会匹配以下值: 1/1/2001ff,即使我使用$标记字符串的结尾。 但如果我给出像ff1/1/2001这样的值,它就会失效。所以它考虑的是字符串的开头,而忽略了字符串的结尾部分

有人知道原因吗。

来自:


从逻辑上讲,检查日期是否有效比使用正则表达式匹配日期更有意义。但是,如果您试图搜索日期,您的正则表达式仍然有效(例如,我在Notepad++find中对其进行了测试)。除此之外,正如评论所说,没有理由使用如此复杂的正则表达式

正如DRAC正确指出的,问题在于缺少括号。非常感谢你指出这一点。
不使用javascript日期对象的原因是我们只需要在文本框中允许mm/dd/yyyy格式。因此,使用正则表达式来验证文本框是很容易的。

为什么需要一个包含20多个捕获组的复杂正则表达式来验证文本框?使用正则表达式无法真正可靠地验证日期,只能验证格式。例如,尝试验证
11/31/13
是否无效。如果你使用
Date
对象,事情会简单得多。没有时间仔细检查它。但是快速查看一下你的正则表达式,让它看起来像是你在闰年上唯一检查的行尾(听起来缺少括号)。在rubular上测试,似乎有效,除非我大错特错,这需要一个已经存在的日期对象,如
d
,但是OP只有一个字符串。
if ( Object.prototype.toString.call(d) === "[object Date]" ) {
  // it is a date
  if ( isNaN( d.getTime() ) ) {  // d.valueOf() could also work
    // date is not valid
  }
  else {
    // date is valid
  }
}
else {
  // not a date
}