正则表达式.NET中的反向引用构造

时间:2013-04-27 10:25:32

标签: .net regex

我的格式是日期:

26-4-03或26/04/03或26.4.3

它是Backreference Constructs的工作变体:

\b\d{1,2}(\/|\.|\-)\d{1,2}\1(\d{1,2))\b

但是我可以这样写吗?

\b(\d{1,2})(\/|\.|\-)\1\2\1\b

可能存在任何具有类似语法的变体吗?

1 个答案:

答案 0 :(得分:2)

不,反向引用构造意味着断言文本与它引用的捕获组匹配的文本相同。它没有重用子模式的含义。

顺便说一下,你的正则表达式可以改写为:

\b\d{1,2}([/.-])\d{1,2}\1\d{1,2)\b

可以在字符类[/.-]中干净地声明分隔符。 .在字符类中失去了它的特殊含义,只是文字.。请注意-在字符类中是特殊的,必须进行转义,或放在字符类的开头或结尾以抑制特殊含义。

(我删除了最后一个捕获组,因为我认为它是多余的 - 如果需要,请将其添加回来)。


作为旁注,在PCRE / Perl正则表达式中,子例程调用构造(?n),其中n是一个引用捕获组(和等效构造)的数字将允许您在捕获组内重用该模式(并且还用于递归正则表达式)。

\b(\d{1,2})([/.-])(?1)\2(?1)\b

请注意,在PCRE中,子程序调用构造是 atomic ,这意味着引擎不会回溯。在Perl中,引擎允许回溯。