是否有可能编写一个正则表达式来匹配出现未知次数的嵌套模式?例如,当在外花括号内嵌套了未知数量的开/闭花括号时,正则表达式是否可以匹配开/闭花括号?

例如:

public MyMethod()
{
  if (test)
  {
    // More { }
  }

  // More { }
} // End

应该匹配:

{
  if (test)
  {
    // More { }
  }

  // More { }
}

当前回答

正确的正则表达式将无法做到这一点,因为您将离开常规语言领域,进入上下文自由语言领域。

然而,严格来说,许多语言提供的“正则表达式”包更强大。

例如,Lua正则表达式有“%b()”识别器,它将匹配平衡圆括号。在你的例子中,你可以使用"%b{}"

另一个类似于sed的复杂工具是gema,您可以很容易地用{#}匹配平衡的花括号。

因此,根据您拥有的工具,您的“正则表达式”(在更广泛的意义上)可能能够匹配嵌套括号。

其他回答

正如zsolt提到的,一些正则表达式引擎支持递归——当然,这些引擎通常使用回溯算法,所以它不是特别有效。例子 : /(?>[^{}]*){(?>[^{}]*)(? R )*(?>[^{}]*)}/ sm

正确的正则表达式将无法做到这一点,因为您将离开常规语言领域,进入上下文自由语言领域。

然而,严格来说,许多语言提供的“正则表达式”包更强大。

例如,Lua正则表达式有“%b()”识别器,它将匹配平衡圆括号。在你的例子中,你可以使用"%b{}"

另一个类似于sed的复杂工具是gema,您可以很容易地用{#}匹配平衡的花括号。

因此,根据您拥有的工具,您的“正则表达式”(在更广泛的意义上)可能能够匹配嵌套括号。

不,你在这一点上进入了上下文自由语法的领域。

使用正则表达式检查嵌套模式非常简单。

'/(\((?>[^()]+|(?1))*\))/'

/(\{(?:\{.*\}|[^\{])*\})/m