当前位置: 首页 > 知识库问答 >
问题:

PHP:首先匹配内括号的preg_match_all?

郑承恩
2023-03-14

在PHP中,我使用带嵌套括号的字符串:

bar[foo[test[abc][def]]bar]foo

我首先需要一个匹配内部括号对的正则表达式,所以preg_match_all找到匹配括号对的顺序应该是:

[abc]
[def]
[test[abc][def]]
[foo[test[abc][def]]bar]

所有文本可能有所不同。

这在preg\u match\u all中是否可能实现?

共有2个答案

谭泉
2023-03-14

在你的问题中不明显的是什么样的“匹配结构”。。。但是您只能使用简单的数组。尝试

  preg_match_all('#\[([a-z\)\(]+?)\]#',$original,$m); 

对于$original='bar[foo[test[abc][def]]bar]foo'返回一个包含“abc”和“def”的数组,即内部数组。

对于输出,您需要一个用于“解析任务”的循环。带有preg_replace_回调的PCRE更适合解析。

也许这个循环是你问题的好线索,

 $original = 'bar[foo[test[abc][def]]bar]foo';

 for( $aux=$oldAux=$original; 
      $oldAux!=($aux=printInnerBracket($aux)); 
      $oldAux=$aux
 );
 print "\n-- $aux";

 function printInnerBracket($s) {
    return preg_replace_callback(
            '#\[([a-z\)\(]+?)\]#',  // the only one regular expression
            function($m) {
               print "\n$m[0]"; 
               return "($m[1])";
            },
            $s
    );
 }

结果(回调打印):

[abc]
[def]
[test(abc)(def)]
[foo(test(abc)(def))bar]
-- bar(foo(test(abc)(def))bar)foo

另见这一相关问题。

太叔景曜
2023-03-14

这在正则表达式中是不可能的。无论你的正则表达式有多复杂,它总是首先返回最左边的匹配。

充其量,您必须使用多个正则表达式,但即使这样,您也会遇到麻烦,因为正则表达式实际上无法计算匹配的括号。最好是以其他方式解析此字符串。

 类似资料:
  • 上面的正则表达式返回括号之间的文本。 如: 如何重写上面的正则表达式,所以我提供了一个类似的字符串,它将返回。i、 e带括号的部分,其中包含大括号中的字符串。

  • 习题3-4 括号匹配检验 假设一个算术表达式中可以包含三种括号:圆括号“(”和“)” 、方圆括号“[”和“]”、和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。若正确配对则输出yes,否则输出no。注意,算术表达式可能没有括号,也可能不合法(不需要判断)。 输入格式: 测试数据有多组,

  • 例3.3.2 括号匹配问题 输入一个由中、小括符组成的字符串。判断其匹配情况,若括号可以成功匹配,则输出yes,否则输出no。 输入格式: 测试数据有多组,处理到文件尾。对于每组测试,输入一个由中、小括符构成的字符串(长度不超过30)。 输出格式: 对于每组测试,若括号可以成功匹配,则输出“yes”,否则输出“no”。引号不必输出。 输入样例: ()[] [()] [(()]] [(]) 输出样例

  • 问题内容: 例如,如果括号/括号在以下情况中匹配: 依此类推,但如果括号/括号不匹配,则应返回false,例如: 等等。你能检查一下这个代码吗?提前致谢。 问题答案: 您的代码在处理’{‘和’}’字符时有些困惑。它应该与如何处理’(’和’)’完全平行。 这段代码经过您的稍微修改后,似乎可以正常使用:

  • 我们现在把注意力转向使用栈解决真正的计算机问题。你会这么写算术表达式 (5+6)*(7+8)/(4+3) 其中括号用于命令操作的执行。你可能也有一些语言的经验,如 Lisp 的构造 (defun square(n) (* n n)) 这段代码定义了一个名为 square 的函数,它将返回参数的 n 的平方。 Lisp 使用大量的圆括号是臭名昭著的。 在这两个例子中,括号必须以匹配的方式

  • 我需要在和之间匹配文本示例: 我需要匹配这个文本 简单正则表达式将正常工作,直到我在文本中放置一些 文本内的卷括号配对以匹配。 有没有可能通过正则表达式来解决这个问题?