首页 > 解决方案 > 使用正则表达式查找字符串中所有出现的日期

问题描述

我写了一个正则表达式,它在字符串中查找日期(可选地后跟时间)。这里是:

(?:[^0-9]+|^)([0-9]{4})[.-]?([0-9]{2})[.-]?([0-9]{2})(?:[_ \-]?([0-9]{2})[\-.;_]?([0-9]{2})[\-.;_]?([0-9]{2}))?(?:[^0-9]+|$)

导致我出现问题的元素是(?:[^0-9]+|^)(第一个非捕获组)和(?:[^0-9]+|$)(最后一个非捕获组)。我需要它们来处理以下情况:(12020-08-02不是日期)或2020-08-022(也不是日期)。但是当我输入时,2020-08-02/2020-08-03我希望有两个匹配项,但我只得到一个,因为/成为第一个匹配项的一部分,并且正则表达式无法(?:[^0-9]+|^)在剩余的输入中找到并丢弃其余部分。

在这里,您可以看到我的正则表达式的更多示例,其中包含长输入。正如你所看到的,有些2020-07-21地方没有找到。

标签: regex

解决方案


你的表情看起来有点复杂。不确定我是否掌握了您的所有要求,但这似乎适用于您的所有示例:

(?<=\D|^)[0-9]{4}[\.-][0-9]{2}[\.-][0-9]{2}(?=\D)(_[0-9]{2}[\:\.-][0-9]{2}[:\.-][0-9]{2})?
  • 日期被识别为.-作为分隔符(向后/向前看以排除尾随数字)
  • _在with.和分隔符之后可以选择识别时间-:您打算检测时间吗?)

编辑:现在我意识到你可能只是想使用后向和前瞻而不是非捕获组:

(?<=[^0-9]|^)([0-9]{4})[.-]?([0-9]{2})[.-]?([0-9]{2})(?:[_ \-]?([0-9]{2})[\-.;_]?([0-9]{2})[\-.;_]?([0-9]{2}))?(?=[^0-9]+|$)

推荐阅读