我有日期格式:
26-4-03 或 26/04/03 或 26.4.3
它是带有反向引用构造的工作变体:
\b\d{1,2}(\/|\.|\-)\d{1,2}\1(\d{1,2))\b
但是我可以这样写吗?
\b(\d{1,2})(\/|\.|\-)\1\2\1\b
可能存在任何具有类似语法的变体?
不,反向引用构造旨在断言文本与它所引用的捕获组匹配的任何内容相同。它没有重用子模式的意义。
顺便说一句,您的正则表达式可以重写为:
\b\d{1,2}([/.-])\d{1,2}\1\d{1,2)\b
分隔符可以在字符类中明确声明[/.-]
。.
在字符类中失去了它的特殊含义,只是一个文字.
. 请注意,-
在字符类中是特殊的,必须转义,或者放在字符类的开头或结尾以抑制特殊含义。
(我删除了最后一个捕获组,因为我认为它是多余的 - 如果需要,请将其添加回来)。
附带说明一下,在 PCRE/Perl 正则表达式中,子例程调用构造(?n)
where n
is a number 引用捕获组(和等效构造)将允许您在捕获组内重用模式(并且也用于递归正则表达式)。
\b(\d{1,2})([/.-])(?1)\2(?1)\b
请注意,在 PCRE 中,子程序调用构造是原子的,这意味着引擎不会回溯。在 Perl 中,引擎允许回溯。