我想用javascript在字符串中搜索日期。例如:
string.search(dateReg);
然后,显示我找到它的日期。
我在(here)找到了一个非常好的正则表达式。它适用于我的字符串:27.11.
或27.11.2016
,但它不适用于abcde 27.11.2016 fghi
(结果:-1
)。
正则表达式无法找到日期,因为日期前后的这些字符:/。我用谷歌搜索了2个小时,但没有找到一个anwser(如何以正确的方式改变正则表达式?)。我也查看了基础正则表达式,但我找不到答案:/。
有人知道如何过滤字符串中的日期吗?
谢谢: - )。
答案 0 :(得分:1)
您可以尝试相同的代码,但用正则表达式边界\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)
上面的代码将匹配:
30/04/2016
31/05/2016
但它不匹配:
31/04/2016
32/05/2016
它将匹配任何在其之前/之后具有字符串的日期:
abcde 27.11.2016
演示:https://regex101.com/r/Hs2sjW/5
<强>更新强>
以前的代码可能存在一些问题。执行此操作的最佳方法是首先检查日期模式,然后检查日期的有效性。检查日期模式的第一个正则表达式可能是这样的:
\d{2}[-.\/]\d{2}(?:[-.\/]\d{2}(\d{2})?)?
然后用正则表达式检查日期的有效性。这是一个有效的javascript:
var myString = "Test 22/10/20 Test"; //Could be any String
var myRegexp = /\d{2}[-.\/]\d{2}(?:[-.\/]\d{2}(\d{2})?)?/g; //Check pattern only
var validDate = /(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])?|(?:(?:16|[2468][048]|[3579][26])00)?)))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))(\4)?(?:(?:1[6-9]|[2-9]\d)?\d{2})?$/g; //Check the validity of the date
myString = myRegexp.exec(myString)
myString = validDate.exec(myString[0])
console.log(myString[0])
&#13;
答案 1 :(得分:0)
我希望这可以帮到你!
/(\d{1,2}[\.\/]){2,2}(\d{2,4})?/g