为什么这个递归正则表达式不起作用?

时间:2012-11-18 02:00:02

标签: php regex

我正在尝试编写一个简单的正则表达式来匹配嵌套的大括号。如果我有这个文字:

{
  apple
  {second}
  banana
}

然后我希望它匹配第一个和最后一个{}之间的整个文本(包括第二对{})。这是我写的正则表达式:

/{ (?:.+?|(?R) ) }/six

这个输出是:

{ apple {second} 

正如您所看到的那样,第一个花括号正在匹配,并且末尾的“香蕉”未匹配。这是我希望它返回的输出:

apple {second} banana 

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您要使用的模式是:

/{ (?:  (?R) | .+? )+ }/six

使用正则表达式,.+?始终优先。 PCRE将匹配最长的字符串,从不寻找替代方案。

只允许替代(..)+重复允许匹配在递归部分和匹配任何占位符之间切换。

答案 1 :(得分:0)

这对你有用吗?

\{([\s\S]*)\}