在正则表达式中检索不同的值组

时间:2018-12-11 14:40:55

标签: c# .net regex recursion

我有以下字符串:

((1+2)*(4+3))

我想通过正则表达式使值分别用括号暴露。这些值必须位于类似字符串数组的数组中。

例如:

  • 第1组:(((1 + 2)*(4 + 3))
  • 第2组:(1 + 2)
  • 第3组:(4 + 3)

我已经尝试过此正则表达式:

(?<content>\(.+\))

但是她不起作用,因为她保持组1

您将拥有可以让我递归管理此解决方案的解决方案?

1 个答案:

答案 0 :(得分:1)

您可能会得到所有以(开始并以)结尾并在其中使用任何数量的平衡嵌套括号的重叠子字符串

var result = Regex.Matches(s, @"(?=(\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!)|)\)))").Cast<Match>().Select(x => x.Groups[1].Value);

请参见regex demo online

正则表达式详细信息

正则表达式是一个正向超前((?=...)),它检查字符串中的每个位置,并在其模式匹配时找到匹配项。由于模式包含在捕获组((...)中),因此该值存储在match.Groups[1]中,一旦找到匹配项,您就可以检索该值。 \((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!)|)\)known pattern,与嵌套的平衡括号匹配。

C# demo

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)