为啥你需要 (?(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 语句 [重复]