我正在学习来自http://www.regular-expressions.info/conditional.html的正则表达式中的条件。
似乎只提到if部分使用环视和反向引用。 if部分可以使用除了环视和反向引用之外的东西吗?
可以将任何表达式用于if部分吗?
请注意,我并不限制使用特定的编程语言。只是在一般情况下,作为链接。
感谢。
答案 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 feature)aaa(?: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使用重复的命名捕获。