【问题标题】:Regex to check for the pattern YYYY-MM-dd is coming in a string variable用于检查模式 YYYY-MM-dd 的正则表达式是否出现在字符串变量中
【发布时间】:2016-02-01 16:07:31
【问题描述】:

我有一个名为 dateStr 的字符串变量,现在这个变量 dateStr 可以有这些可能的值

21/02/2014
05/25/2014
05/12/16
2016/12/26  (YYYY/MM-dd)   ****//check this pattern format  *******
2014-JAN-04 (YYYY-MMM-dd)   ****//check this pattern format ********

现在请提供任何正则表达式,我可以通过它检查格式 YYYY/MM/dd 和 YYYY-MM-dd 基本上是哪一年即将到来的第一部分

所以请建议任何正则表达式交叉验证前四位数字是 YYYY 所以请建议如何检查这个我们可以构建任何正则表达式检查,让我们说如果前三位数字不是整数或第三位数字是 - 或 /那么字符串不是 YYYY-MM-dd 格式,请告知正确的正则表达式

【问题讨论】:

  • 尝试解析日期并捕获任何异常会容易得多...
  • “慢很多”是 0.02 毫秒而不是 0.015 毫秒?正确处理月份名称和闰年并确保始终使用/- 的正则表达式会消耗更多的CPU 周期。
  • @Grogi 我会说相反:正确验证日期的正则表达式可能会更慢(您当前的答案可能会更快,但不执行验证,并且对于 OP 来说看起来过于简单要求)!如果 OP 以后需要使用该日期,则无论如何都需要对其进行解析......

标签: java regex date


【解决方案1】:

我认为您的问题对要求不是很清楚,但这应该表明方向:

\d{4}([-/])(\d{2}|\w{3})\1\d{2}

如果您搜索英文月份名称,则可以将 \w{3} 替换为 JAN|FEB|MAR 等等。您还可以对月份和日期值使用一些值约束来改进表达式:

\d{4}([-/])(0[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)\1(0[1-9]|1\d|2\d|3[01])

这将排除 9999/FOO-992016-02/01 之类的值,但匹配 2016/02/012016-02-01

请记住,使用正则表达式无法检查无效日期,例如2016-02-31

【讨论】:

  • 9999/FOO-99 将是一个有效的日期。
  • @spash 好吧,问题是让我们说日期是否以 dd-MM-YYYY 或 MM-dd-YYYY 的形式出现,那么前三位数字包含 - 或 / 并让我们说格式是否即将到来作为 YYYY-MM-dd 或 YYYY/MM/dd 然后在前三位数字中的值是 Y 所以基本上我必须检查那一年是 YYYY-MM-dd 还是 YYYY/MM/dd 如果我有做某事
  • 非常感谢,我不需要日期验证我的问题是要捕捉到该日期的格式,特别是我必须跟踪 yyyy-MM-dd 或 yyyy 中的字符串变量中的日期/mm/dd 格式,所以现在请告知您的解决方案现在适用于这两种情况
【解决方案2】:

(?:\d{4}/\d{2}/\d{2})|(?:\d{4}-\d{2}-\d{2})

【讨论】:

  • 您能否解释一下有关在上述正则表达式中检查的一些细节,请检查字符串是否首先包含为 yyyy 然后继续它包含 / 或 - 在 3 位置然后不继续
  • 我也可以将其解释为 ((?:\d{4}/\d{2}/\d{2})|(?:\d{4}-\d{ 2}-\d{2})) 则日期字符串为 yyyy-mm-dd 或 yyyy/mm/dd 格式
猜你喜欢
  • 2012-05-15
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2017-07-10
相关资源
最近更新 更多