我有以下字符串:
((1+2)*(4+3))
我想通过正则表达式使值分别用括号暴露。这些值必须位于类似字符串数组的数组中。
例如:
我已经尝试过此正则表达式:
(?<content>\(.+\))
但是她不起作用,因为她保持组1
您将拥有可以让我递归管理此解决方案的解决方案?
答案 0 :(得分:1)
您可能会得到所有以(
开始并以)
结尾并在其中使用任何数量的平衡嵌套括号的重叠子字符串
var result = Regex.Matches(s, @"(?=(\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!)|)\)))").Cast<Match>().Select(x => x.Groups[1].Value);
正则表达式详细信息
正则表达式是一个正向超前((?=...)
),它检查字符串中的每个位置,并在其模式匹配时找到匹配项。由于模式包含在捕获组((...)
中),因此该值存储在match.Groups[1]
中,一旦找到匹配项,您就可以检索该值。 \((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!)|)\)
是known pattern,与嵌套的平衡括号匹配。
var str = "((1+2)*(4+3))";
var pattern = @"(?=(\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!)|)\)))";
var result = Regex.Matches(str, pattern)
.Cast<Match>()
.Select(x => x.Groups[1].Value);
Console.WriteLine(string.Join("\n", result));
输出:
((1+2)*(4+3))
(1+2)
(4+3)