正则表达式中,如果条件 (?(R)...|...) 有何用处?

6
我在查阅正则表达式文档时遇到了一些困惑。在(?(R)...|...)的上下文中,(R)条件被称为:

perl有点晦涩:

(R)

    检查表达式是否已在递归内部进行评估。完整语法:(?(R)then|else)

PCRE没有什么用:

(?(R) 整体递归条件

regular-expressions.info对此毫无发言。

这个条件是用来判断子程序堆栈是否超过1层深还是表示其他含义?


请参阅此解释如果没有名为“R”的子模式,则当对整个模式或任何子模式进行递归调用时,条件为真 - Wiktor Stribiżew
@WiktorStribiżew 是的,我基本上从perl的解释中得出了这个结论。他们对递归的定义是什么?同一个子例程在调用堆栈中被调用吗?所以,有一个搜索来查看当前子例程是否被调用超过一次?还是更简单,只是测试堆栈深度是否> 1?我之所以问,是因为perl声明?(Rn)?(Rname)仅返回一个调用。 - Adrian
这就是我认为的全部内容。R本身会检查整个模式是否递归,Rn/Rname则检查特定组模式是否递归,检查结果是布尔值,如果发生了递归,则为True,否则为False。 - Wiktor Stribiżew
是的,我认为我对他们使用递归这个词有点困惑。对我来说,这意味着一个部分正在调用它自己,而不是一个部分正在调用任何其他部分。($a) = "abc" =~ /((?<a>(?(R)b|a))(?&a))/; print $a 输出ab,因此它只是检查堆栈深度是否> 0。 - Adrian
@WiktorStribiżew 但是这个检查是浅层的,意味着只检查了当前递归的层级。 - AnArrayOfFunctions
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接