【问题标题】:regex search date in string正则表达式搜索字符串中的日期
【发布时间】:2017-04-11 01:15:15
【问题描述】:

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

string.search(dateReg);

然后,当我找到它时显示日期。

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

由于日期前后的这些字符,正则表达式无法找到日期:/。我用谷歌搜索了 2 个小时,但没有找到答案(如何以正确的方式更改正则表达式?)。我还查看了基础正则表达式,但找不到答案:/。

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

谢谢你:-)。

【问题讨论】:

标签: javascript regex


【解决方案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])

【讨论】:

  • 非常感谢!这正是我想要的。
  • 匹配日期模式是一回事,检查有效性是另一回事。我认为将两者结合起来并不是一个好主意。给定 29/2/2015,上述正则表达式匹配“29/2/”,同样适用于 29/2/2000,这是一个有效日期。在我看来,首先将模式与/\d{1,2}\/\d{1,2}\/\d{4}/ 之类的东西匹配起来要简单得多,然后检查它是否有效,因为似乎无论如何都需要第二步来验证日期。
  • @RobG 感谢您的反馈。我同意你的看法。将这两件事结合在一个代码中效率较低。在我的正则表达式中,似乎 2 月 29 日是唯一引起问题的日期。我会努力解决的。
  • @RobG 我更新了代码。它现在似乎认识到 29/2/2000 和 29/2/2015 之间的区别。
  • @Ibrahim 嗯,我不匹配一个月的 29,30 和 31 号 (29.12) :/.
【解决方案2】:

希望对你有帮助!

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

【讨论】:

    猜你喜欢
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多