RegEx匹配嵌套括号,包括开始和结束括号

时间:2015-06-28 02:05:17

标签: c# .net regex

string st = "this (a,b) and this (s,(r,t),u) is a test";
var regex = new Regex(@"\(([^()]+| (?<Level>\()| (?<-Level>\)))+(?(Level)(?!))\)", RegexOptions.IgnorePatternWhitespace);

foreach (Match c in regex.Matches(input))
{
  Console.WriteLine(c.Value.Trim('(', ')'));
}

.NET 4.5中的上述C#代码正确返回:

a,b
s,(r,t),u

但我需要包括括号的输出:

(a,b)
(s,(r,t),u)

2 个答案:

答案 0 :(得分:1)

你不能用正则表达式做到这一点。

您可以以贪婪或懒惰的方式使用正则表达式,但不能应用逻辑来处理括号的平衡。

如果您使用exists(),您将从第一个括号到最后一个括号捕获所有内容(贪婪),如果您使用\(.*\)(懒惰或不同意),您将从第一个到第二个匹配。正则表达式不是匹配嵌入式字符串的正确工具(这就是为什么它们与嵌入式xhtml标签匹配也是一个坏主意。)

Imho,你应该在for循环中使用一个简单的平衡算法。但是,如果您仍想使用正则表达式,可以查看this thread

答案 1 :(得分:0)

如果我理解正确,您目前的输出为:

a,b
s,(r,t),u

由于您使用的是Trim('(', ')'),因此会删除外部括号 - 要包括它们:

Console.WriteLine(c.Value)

<强>结果:

(a,b)
(s,(r,t),u)