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

标签 php regex

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

{
  apple
  {second}
  banana
}

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

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

其输出是:

{ apple {second} 

正如您所看到的,第一个花括号正在匹配,而末尾的“banana”没有被匹配。这是我希望它返回的输出:

apple {second} banana 

我做错了什么?

最佳答案

您要使用的模式是:

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

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

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

关于php - 为什么这个递归正则表达式不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13436783/

相关文章:

PHP:从 MySQL 创建数组以构建 HTML 日历

php - 拉维尔 : How to send image or file to API

python - 使用正则表达式来匹配顺序无关的字符组(在子字符串中)同时限制给定字符可以出现的次数的优雅方法?

Java正则表达式多行

php - 尝试更新空行时没有抛出 mySQL 错误

PHP 变量和极慢的 MySQL 查询

php - 使用正则表达式解析电子邮件字符串

java - 尽管 matches() 为真,但正则表达式捕获组无法识别组 (1)

php - 在 Laravel Eloquent 中向表中插入一条空记录

java - Scala:查找不以特定字符串结尾的最大字符串的正则表达式