我正在尝试使用嵌套括号解析数学表达式:
(1 * (2 - 3)) + 4
我想将每个表达式都放在括号中,如下所示:
(1 * (2 - 3))
(2 - 3)
使用这个表达式:(.*?\))(?=($|[^(]+))
我得到这个结果:
(1 * (2 - 3)
)
并使用这个表达式:\(.*?\)
我得到这个结果:
(1 * (2 - 3)
但是没有任何东西可以正常工作。我怎样才能在里面循环一个表达式?
我正在尝试使用嵌套括号解析数学表达式:
(1 * (2 - 3)) + 4
我想将每个表达式都放在括号中,如下所示:
(1 * (2 - 3))
(2 - 3)
使用这个表达式:(.*?\))(?=($|[^(]+))
我得到这个结果:
(1 * (2 - 3)
)
并使用这个表达式:\(.*?\)
我得到这个结果:
(1 * (2 - 3)
但是没有任何东西可以正常工作。我怎样才能在里面循环一个表达式?
您可以使用
(?=(\((?>[^()]+|(?<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)
通常的方法是使用递归正则表达式,但不幸的是,C# 的正则表达式不支持此功能。或者,您可以手动解析字符串(并且此 PAQ 中提供了C# 代码来执行此操作)。