正则表达式模式匹配数学表达式

时间:2011-06-18 23:49:03

标签: c# regex

我有以下表达式:

"3 + 2 * ((1 + 1 - (2 + 4))) + 112 * 31 - ((1+1) - 14 + 1)"

我想用最高级别的parentesis分割表达式

例如:

String Expression = "3 + 2 * ((1 + 1 - (2 + 4))) + 112 * 31 - ((1+1) - 14 + 1)";
String[] result = Regex.Split(expression, "??");

预期产出:

//result[0] = 3 + 2 *
//result[1] = (1 + 1 - (2 + 4))
//result[2] = + 112 * 31 -
//result[3] = 3 + 2 *
//result[4] = (1+1) - 14 + 1

4 个答案:

答案 0 :(得分:3)

这通常不是正则表达式的工作。但是,这个msdn blog article表明在.net版本中可能使用名为“Balanced Matching”的扩展名。

不是c#开发人员,我认为我不能完成回答,但也许这会有所帮助。

您可能最好找到或编写一个实际的解析器。

答案 1 :(得分:3)

这个正则表达式可以满足您的需求,因为您使用的是.NET。它使用.NET独有的一个称为平衡组的功能。

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

以下代码:

string expression = "3 + 2 * ((1 + 1 - (2 + 4))) + 112 * 31 - ((1+1) - 14 + 1)";
string pattern = @"^[^(]*(?=\()|(?<=\()(?>[^()]+|\((?<depth>)|\)(?<-depth>))*(?(depth)(?!))(?=\))|(?(depth)|[^\(\)]+)";
MatchCollection results = Regex.Matches(expression,pattern);

填充结果数组的以下值的结果:

//results[0] = 3 + 2 * 
//results[1] = (1 + 1 - (2 + 4))
//results[2] =  + 112 * 31 - 
//results[3] = (1+1) - 14 + 1

以下是关于平衡群组的相关博文:http://blog.stevenlevithan.com/archives/balancing-groups

答案 2 :(得分:0)

尝试使用正则表达式:

([^*]+\*)\s*\x28(.+?)\x29\s+([^-]+\-)(.+?)

-

   string a = "3 + 2 * ((1 + 1 - (2 + 4))) + 112 * 31 - ((1+1) - 14 + 1)";
                Match match = Regex.Match(a, @"([^*]+\*)\s*\x28(.+?)\x29\s+([^-]+\-)(.+?)");
                for (int c = 0, len = match.Length; c < len; c++)
                {
                    Console.WriteLine(match.Groups[c].Value);
                }

好吧,我没有更好的解决方法。

答案 3 :(得分:0)

这个应该得到你需要的东西:

\(((?>\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!)))\)

查看本文以获取“嵌套结构”的概述:http://www.codeproject.com/KB/recipes/Nested_RegEx_explained.aspx