Javascript 字符串中的正则表达式搜索日期

Javascript 字符串中的正则表达式搜索日期,javascript,regex,Javascript,Regex,我想用javascript在字符串中搜索日期。例如: string.search(dateReg); 然后,显示我找到它的日期 我在()找到了一个非常好的正则表达式。它适用于我的字符串:27.11.或27.11.2016,但不适用于abcde 27.11.2016 fghi(结果:-1) 正则表达式找不到日期,因为日期前后有以下字符:/。我在谷歌上搜索了2个小时,但没有找到答案(如何正确地更改正则表达式?)。我还研究了基本正则表达式,但没有找到答案:/ 有人知道如何从字符串中过滤日期吗 谢谢:

我想用javascript在字符串中搜索日期。例如:

string.search(dateReg);
然后,显示我找到它的日期

我在()找到了一个非常好的正则表达式。它适用于我的字符串:
27.11.
27.11.2016
,但不适用于
abcde 27.11.2016 fghi
(结果:
-1

正则表达式找不到日期,因为日期前后有以下字符:/。我在谷歌上搜索了2个小时,但没有找到答案(如何正确地更改正则表达式?)。我还研究了基本正则表达式,但没有找到答案:/

有人知道如何从字符串中过滤日期吗

谢谢:-)。

我希望这对你有帮助

/(\d{1,2}[\.\/]){2,2}(\d{2,4})?/g

您可以尝试使用相同的代码,但将$and^替换为regex word boundry
\b
。代码应该如下所示:

(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})(?=\W)|\b(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])?|(?:(?:16|[2468][048]|[3579][26])00)?)))(?=\W)|\b(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))(\4)?(?:(?:1[6-9]|[2-9]\d)?\d{2})?(?=\b)
\d{2}[-.\/]\d{2}(?:[-.\/]\d{2}(\d{2})?)?
上述代码将匹配:

2016年4月30日

2016年5月31日

但它不会匹配:

2016年4月31日

2016年5月32日

并且它将匹配之前/之后有字符串的任何日期:

abcde2016年11月27日

演示:

更新:

前面的代码可能有一些问题。最好的方法是先检查日期模式,然后检查日期的有效性。检查日期模式的第一个正则表达式可能如下所示:

(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})(?=\W)|\b(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])?|(?:(?:16|[2468][048]|[3579][26])00)?)))(?=\W)|\b(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))(\4)?(?:(?:1[6-9]|[2-9]\d)?\d{2})?(?=\b)
\d{2}[-.\/]\d{2}(?:[-.\/]\d{2}(\d{2})?)?
然后用正则表达式检查日期的有效性。下面是一个有效的javascript:

var myString=“测试22/10/20测试”//可以是任何字符串
var myRegexp=/\d{2}[-.\/]\d{2}(?:[-.\/]\d{2}(\d{2})?/g//仅检查模式
(2)1 124;(1)1 124;(1)1 124;(1)1 124;(1)1 124;(1)1 124;(1)1 124;(1)1 124;(1)1:::::::::::::::::(以下以下:::::::(:31(((\////////////124???????????????????????????????????????????))))))))))目前目前((((////////////////////////////////////////////)目前目前目前目前(((((((::::::::::::::::[048][13579][26]?(?:(?:16[2468][048][3579][26]))$)^(:0?[1-9]| 1\d | 2[0-8])(\/|-|\)(?:(?:0?[1-9])(?:1[0-2])(\4)(?:(?:(?:1[6-9]|[2-9])?$/g//检查日期的有效性
myString=myRegexp.exec(myString)
myString=validDate.exec(myString[0])

console.log(myString[0])
正在尝试匹配与2016年11月27日相似的日期或仅与2016年11月27日相似的日期?请阅读以下内容:非常感谢!这正是我想要的。匹配日期模式是一回事,检查有效性是另一回事。我认为把两者结合起来不是个好主意。鉴于2015年2月29日,上述正则表达式与“29/2/”匹配,也适用于2000年2月29日,这是一个有效日期。在我看来,首先将模式与
/\d{1,2}\/\d{1,2}\/\d{4}/
之类的内容进行匹配要简单得多,然后检查它是否有效,因为似乎第二步仍然需要验证日期。@RobG感谢您的反馈。我同意你的看法。将这两件事合并到一个代码中效率较低。在我的正则表达式中,2月29日似乎是引起问题的唯一日期。我会设法修复它。@RobG我更新了代码。它似乎认识到了2000年2月29日和2015年2月29日之间的区别。@Ibrahim Hm,我不符合一个月的29、30和31日(29.12):/。