假设我有string: "abc{def{ghi{jkl}mno{pqr}st}uvw}xyz"
我希望与此匹配:"{def{ghi{jkl}mno{pqr}st}uvw}"
我的正则表达式应该是什么样的......?
换句话说,匹配应该以“{”开头并以“}”结尾,但它必须具有尽可能多的{'s}。
答案 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)
你的表达可能是:
\{.*\}
'*'是贪婪的,所以它会从第一个括号中找到所有内容,直到找到最后一个括号