我有以下表达式:
"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
答案 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