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)
答案 0 :(得分:1)
你不能用正则表达式做到这一点。
您可以以贪婪或懒惰的方式使用正则表达式,但不能应用逻辑来处理括号的平衡。
如果您使用exists()
,您将从第一个括号到最后一个括号捕获所有内容(贪婪),如果您使用\(.*\)
(懒惰或不同意),您将从第一个到第二个匹配。正则表达式不是匹配嵌入式字符串的正确工具(这就是为什么它们与嵌入式xhtml标签匹配也是一个坏主意。)
答案 1 :(得分:0)
如果我理解正确,您目前的输出为:
a,b
s,(r,t),u
由于您使用的是Trim('(', ')')
,因此会删除外部括号 - 要包括它们:
Console.WriteLine(c.Value)
<强>结果:强>
(a,b)
(s,(r,t),u)