使用正则表达式查找匹配括号

时间:2010-02-20 03:37:52

标签: php regex preg-replace

假设我有string: "abc{def{ghi{jkl}mno{pqr}st}uvw}xyz"

我希望与此匹配:"{def{ghi{jkl}mno{pqr}st}uvw}"

我的正则表达式应该是什么样的......?

换句话说,匹配应该以“{”开头并以“}”结尾,但它必须具有尽可能多的{'s}。

6 个答案:

答案 0 :(得分:8)

我想我在另一个帖子中找到了答案..

"#\{((?>[^\{\}]+)|(?R))*\}#x"

我用不同的字符串测试它,它似乎做了这个工作..

关于它是如何工作的任何评论..?优点和缺点..?

感谢您的回答。:)

答案 1 :(得分:5)

该语法不规则,因此您无法使用正则表达式来解析它。

答案 2 :(得分:2)

虽然技术上可以使用PCRE执行此操作,但这是一个坏主意(PCRE实际上能够通过递归运算符解析某些非正则表达式,但这很快就会变得过于复杂)。

你最好写一些只是遍历字符串并记录当前打开的括号数量的东西。

答案 3 :(得分:0)

我会开发一个脚本,从两端开始记下每个打开和关闭括号的字符位置,然后将两者分配在一起以获得“匹配对”。它当然稍微复杂一些,但我希望你能理解我的目标。

答案 4 :(得分:-1)

#!/usr/bin/perl
use strict;
use warnings;

my $str = "abc{def{ghi{jkl}mno{pqr}st}uvw}xyz" ;
$str =~ /[^{]*({.*})/ ;
print $1 ;

结果是:

{def{ghi{jkl}mno{pqr}st}uvw}

满足您的需求?我不熟悉php,但我猜你仍然可以使用相同的正则表达式。

答案 5 :(得分:-2)

你的表达可能是:

\{.*\}

'*'是贪婪的,所以它会从第一个括号中找到所有内容,直到找到最后一个括号