2

我正在尝试使用嵌套括号解析数学表达式:

(1 * (2 - 3)) + 4

我想将每个表达式都放在括号中,如下所示:

  • (1 * (2 - 3))
  • (2 - 3)

使用这个表达式:(.*?\))(?=($|[^(]+))我得到这个结果:

(1 * (2 - 3)

)

并使用这个表达式:\(.*?\)我得到这个结果:

(1 * (2 - 3) 

但是没有任何东西可以正常工作。我怎样才能在里面循环一个表达式?

4

2 回答 2

2

您可以使用

(?=(\((?>[^()]+|(?<c>)\(|(?<-c>)\))*(?(c)(?!))\)))

请参阅正则表达式演示详情

  • (?=- 积极的展望:
    • (\((?>[^()]+|(?<c>)\(|(?<-c>)\))*(?(c)(?!))\)))- 第 1 组:
      • \(- 一个(字符
      • (?>[^()]+|(?<c>)\(|(?<-c>)\))*(- 除and之外的任何一个或多个字符的零次或多次重复),或(char(将值压入组“c”堆栈)或)char(从组“c”堆栈弹出值)
      • (?(c)(?!))- 如果“c”组堆栈不为空,则失败并回溯
      • \)- 一个)字符。

请参阅C# 演示

var text = "(1 * (2 - 3)) + 4";
var pattern = @"(?=(\((?>[^()]+|(?<c>)\(|(?<-c>)\))*(?(c)(?!))\)))";
var results = Regex.Matches(text, pattern)
    .Cast<Match>()
    .Select(m => m.Groups[1].Value)
    .ToList();
Console.WriteLine(String.Join(", ", results));
// => (1 * (2 - 3)), (2 - 3)
于 2021-04-19T21:07:08.573 回答
-1

通常的方法是使用递归正则表达式,但不幸的是,C# 的正则表达式不支持此功能。或者,您可以手动解析字符串(并且此 PAQ 中提供了C# 代码来执行此操作)。

于 2021-04-19T21:05:24.033 回答