为啥你需要 (?(R)...|...) if 正则表达式中的条件?

Posted

技术标签:

【中文标题】为啥你需要 (?(R)...|...) if 正则表达式中的条件?【英文标题】:Why would you ever need (?(R)...|...) if condition in a regex?为什么你需要 (?(R)...|...) if 正则表达式中的条件? 【发布时间】:2022-01-07 01:54:39 【问题描述】:

我正在查看一些正则表达式文档,但被某些东西弄糊涂了。 (?(R)...|...) 上下文中的 (R) 条件据说是:

perl 有点神秘:

(R)

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

PCRE 没多大用处:

(?(R) 整体递归条件

而regular-expressions.info 对此无话可说。

这个条件是说子程序堆栈是否超过 1 级深还是意味着其他什么?

【问题讨论】:

参见this explanation:如果没有名为“R”的子模式,则如果对整个模式或任何子模式进行了递归调用,则条件为真 @WiktorStribiżew 是的。几乎是我从 perl 解释中得到的。他们对递归的定义究竟是什么?在调用堆栈中调用相同的子程序?那么,有一个搜索看看当前子程序被调用了不止一次?还是更简单,因为他们只是测试堆栈深度是否> 1?我只问,因为 perl 声明 ?(Rn)?(Rname) 它只返回一个电话。 这就是我想的全部。 R 本身检查整个模式是否被递归,Rn/Rname 检查特定组模式是否被递归,检查结果是布尔值,如果递归发生则为 True,否则为 False。跨度> 是的。我想我对他们使用递归这个词很感兴趣。对我来说,这将是一个部分正在调用自己,而不是一个部分正在调用任何其他部分。 ($a) = "abc" =~ /((?(?(R)b|a))(?&a))/; print $a 输出 ab,所以它只是检查堆栈深度是否 > 0。 @WiktorStribiżew 但检查很浅,意味着只检查当前的递归级别。 【参考方案1】:

见this explanation:

如果没有名为“R”的子模式,则如果对整个模式或任何子模式进行了递归调用,则条件为真

这意味着(?(R) 条件检查整个模式是否被递归至少一次,检查结果是布尔值,如果递归发生则True , 否则 False

如果您需要查看一些示例,请参阅https://github.com/PhilipHazel/pcre2/blob/587b94277b50ababde2380b5877c93e36ca65db8/src/pcre2_jit_test.c。

【讨论】:

以上是关于为啥你需要 (?(R)...|...) if 正则表达式中的条件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个正则表达式不起作用:r'.*logo.*' [重复]

为啥我不能使用正则表达式来评估 if...else 语句 [重复]

为啥L=wxw^R| w, x 属于 a,b^+ 是正则语言

为啥这个正则表达式模式不能按预期工作?

为啥在这个正则表达式中左括号被转义?

正则表达式.+可以匹配空格,但是[.\w]+却不匹配,为啥?