(?:\b|\.|\s)+(d{1,4}|m{1,4}|y{4}|y{2}){1}(?:\.|\s){1}(d{1,4}|m{1,4}|y{4}|y{2})?(?:\.|\s)?(d{1,4}|m{1,4}|y{4}|y{2})?(?:\.|\s)?
https://regex101.com/r/ePV1Aq/1
它工作正常,但它也在带引号的字符串中找到匹配项,我该如何排除它?好吧,也许同时写下所有这些香肠会更漂亮。我尝试减少由于重复,但随后结构破裂(匹配整个日期,组中是单独的元素)
例子:
“带引号的字符串 DD.MM.YYYY 内的格式不考虑:” DD.MM.YYYY “这里也是 dd.mm”
这里我们看到 3 个匹配项,有必要只找到第二个,因为 第一个和第三个位于带引号的字符串“”内
重要的!!!很可能仅适用于 PCRE 库
正则表达式:
工作示例: regex101.com
大块说明:
(?:"[^"]*"[^"]*?\K|(*SKIP))
- 不是捕获组,获取引号中的子字符串并重置捕获\K
,否则我们不允许光标返回到当前位置。用于仅包含引号中捕获的字段的字符串。(?(DEFINE)(?'d'd{1,4}|m{1,4}|y{2,4}))
- 我们用正则表达式的模板声明一个变量,以免多次编写相同的内容,而是简单地调用声明的变量。(?<![dmy.])
- 负向回顾以排除不完整的匹配(可选)。((?P>d))\.(?!\2)((?P>d))
- 我们调用声明的组,然后检查该组是否不重复,以便排除例如MM.MM
.(?:\.(?!\2|\3)((?P>d)))?
- 第三部分的可选组,但在捕获之前,我们检查是否与前面的组不匹配,其值为:MM.DD.MM
或MM.DD.DD
。