if部分可以使用除了环视和反向引用之外的东西吗?

时间:2014-06-09 15:28:18

标签: regex

我正在学习来自http://www.regular-expressions.info/conditional.html的正则表达式中的条件。

似乎只提到if部分使用环视和反向引用。 if部分可以使用除了环视和反向引用之外的东西吗?

可以将任何表达式用于if部分吗?

请注意,我并不限制使用特定的编程语言。只是在一般情况下,作为链接。

感谢。

1 个答案:

答案 0 :(得分:2)

是的,以Perl / PCRE为例,您可以测试是否存在捕获组(这也适用于.net)

(?(2)...|...)

(?(<group>)...|...)  # for a named capture

或者是否已达到递归级别:

(?(R)...|...)

(?(R2)...|...)

<小时/> 如果您希望在字符串中的特定位置知道子模式是否会在以后匹配,那么就像在您的问题中描述它一样使用前瞻,例如字符串aaabbbccc和{{1} }:

aaazzz

aaa(?(?=...ccc)bbb|zzz) 

但大多数时候,你不需要这样做,需要进行简单的改动:

aaa(?(?=...ccc)(bbb|zzz))  # with a capture

或者如果您需要使用相同的数字或名称进行捕获(Branch reset featureaaa(?:bbbccc|zzz) (每个替代方案中的捕获具有相同的数字)

(?|...|...|...|...)

同名:

aaa(?|(bbb)ccc|(zzz))

或具有相同名称而没有分支重置(仅限PCRE):

aaa(?|(?<name>bbb)ccc|(?<name>zzz)) # but writing the name of the capture
                                    # a second time is not needed: 
aaa(?|(?<name>bbb)ccc|(zzz)) 

(?J)aaa(?:(?<name>bbb)ccc|(?<name>zzz)) 允许重复命名的捕获)

允许.net使用重复的命名捕获。