gpt4 book ai didi

php - 嵌套括号前带有文本的递归正则表达式

转载 作者:可可西里 更新时间:2023-11-01 13:53:20 26 4
gpt4 key购买 nike

我有以下文字

$text = 'This is a test to see if something(try_(this(once))) works';

我需要使用正则表达式从文本中获取something(try_(this(once)))。我有以下问题

  • 我的嵌套不会保持不变,我的文字可以是

    • something(try_(this(once)))
    • something(try_this(once))
    • something(try_thisonce)

我已经尝试了在网站上找到的许多正则表达式,但无法使其正常工作。这是离我最近的地方

示例 1:

$text = 'This is a test to see if something(try_(this(once))) works';
$output = preg_match_all('/(\(([^()]|(?R))*\))/', $text, $out);
?><pre><?php var_dump($out[0]); ?></pre><?php

这输出

array(1) {
[0]=>
string(18) "(try_(this(once)))"
}

无论我在哪里添加单词 something(例如 '/something(\(([^()]|(?R))*\))/''/(\something(([^()]|(?R))*\))/'), 我得到一个空数组或

示例 2

$text2 = 'This is a test to see if something(try_(this(once))) works';
$output2 = preg_match_all('/something\((.*?)\)/', $text2, $out2);
?><pre><?php var_dump($out2[0]); ?></pre><?php

通过这段代码,我确实得到了 something 这个词,

array(1) {
[0]=>
string(25) "something(try_(this(once)"
}

但随后表达式停止并在第一次关闭 ) 后返回,这是预期的,因为这不是递归表达式

我如何在第一次打开 ( 之前递归匹配并返回带有单词 something 的嵌套括号,如果可能的话,会发生什么然后可能会或可能不会something 之前的空格,例如

  • something(try_(this(once)))
  • something (try_(this(once)))

最佳答案

(?R) 并不是获得能够处理平衡事物(例如括号)的模式的魔法咒语。 (?R)(?0) 是同一回事,它是“捕获组零”的别名,换句话说,就是整个模式。

以同样的方式,您可以使用 (?1)(?2) 等作为第 1、2 组等中子模式的别名.

顺便说一句,请注意除了 (?0)(?R) 显然总是在它们的子模式中,因为它是整个模式, (?1), (?2) 仅当它们在各自的组中时才会引发递归,并且只能用于不重写模式的一部分.

something\((?:[^()]|(?R))*\) 不起作用,因为它强加了每个嵌套(或不嵌套)的左括号前面有 something 在你的字符串中。

结论,你不能在这里使用(?R),你需要创建一个捕获组来只处理嵌套的括号:

(\((?:[^()]|(?1))*\))

可以用更高效的方式写成:

(\([^()]*(?:(?1)[^()]*)*+\))

要完成,您只需要添加递归中不再包含的东西:

something(\([^()]*(?:(?1)[^()]*)*+\))

请注意,如果 something 是一个具有不确定数量的捕获组的子模式,那么使用这样的相对引用来引用最后打开的捕获组会更方便:

som(eth)ing(\([^()]*(?:(?-1)[^()]*)*+\))

关于php - 嵌套括号前带有文本的递归正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32954226/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com