C# 查找并替换方程式(正则表达式?)

C# 查找并替换方程式(正则表达式?),c#,regex,.net-3.5,C#,Regex,.net 3.5,我正在将一些excel公式转换到另一个系统,需要做一些相当漂亮的搜索和替换magic。我想在这种情况下,正则表达式是工作的工具,但如果有人有任何其他想法,我想听听他们 我正在努力将这些公式转换成类似SQL语法的东西。我还必须处理代数符号,因此我可能有以下几点: 9^2需要变成力量(9,2)。 (A+3)^3将需要成为电源((A+3),3) 最好的方法是什么 如果有区别的话,我使用的是C#3.5 编辑:我必须解析的一个示例(电源符号在末尾): 由于嵌套括号的可能性,正则表达式不适合此任务。最好使用

我正在将一些excel公式转换到另一个系统,需要做一些相当漂亮的搜索和替换magic。我想在这种情况下,正则表达式是工作的工具,但如果有人有任何其他想法,我想听听他们

我正在努力将这些公式转换成类似SQL语法的东西。我还必须处理代数符号,因此我可能有以下几点:

9^2需要变成力量(9,2)。 (A+3)^3将需要成为电源((A+3),3)

最好的方法是什么

如果有区别的话,我使用的是C#3.5

编辑:我必须解析的一个示例(电源符号在末尾):


由于嵌套括号的可能性,正则表达式不适合此任务。最好使用数学表达式解析器

但这并非不可能。例如,通过重复替换模式

((?=[\w.(])[\w.]*\s*(?:\(?>[^()])+(?)*(?)*(?(O1)(?!)\))\s*(?=[\w.(])[\w.]*\s*(?:\((?>[^()])+(?)*((?)*((?)*((?>[^())+(?)+(?)*(?)(?)*((?)*)(((?)(?)*)*((((?)))(((?)))((((?))))*)((((?))))))(((((?))))))*)))(((((

在字符串不变之前,它应该能够将所有
a^b
转换为
POWER(a,b)
。例如:

   (a+3)^(b+5^(c+3)) + 9 ^ 2 + (A + 3)^3 + (5^7)^(6^(8^9-1)-3)
-> POWER((a+3),(b+5^(c+3))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((5^7),(6^(8^9-1)-3))
-> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((POWER(5,7)),(POWER(6,(8^9-1))-3))
-> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((POWER(5,7)),(POWER(6,(POWER(8,9)-1))-3))
-> done
注意,这个正则表达式将假定
^
是左关联的,而不是右关联的

   1^2^3
-> POWER(1,2)^3
-> POWER(POWER(1,2),3)
-> done

虽然1^2^3本身的格式不好。

您的表达式是否会变得更复杂(例如,(a+3)^(b+5^(c+3)))?如果是的话,正则表达式可能不是这项工作的最佳工具。是的,它们可以-因此我的问题。我不是正则表达式专家,我想听听符号方程的其他解析技术。谢谢你的回答。我应该处理任意长的方程,但实际上我认为这对我来说相当容易检查是否有任何特殊情况通过裂缝。我会试一试。我试过了,但正则表达式中似乎有错误。它不替换pwoer符号。我使用.NET正则表达式替换方法有什么区别吗?@Alex:它使用的是
regex.replace
。确保模式中没有换行符。是的,我有rking now。它适用于简单表达式,但不适用于某些更复杂的语句。我将在我的原始帖子中举一个这个正则表达式未能解析的字符串的例子。
   (a+3)^(b+5^(c+3)) + 9 ^ 2 + (A + 3)^3 + (5^7)^(6^(8^9-1)-3)
-> POWER((a+3),(b+5^(c+3))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((5^7),(6^(8^9-1)-3))
-> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((POWER(5,7)),(POWER(6,(8^9-1))-3))
-> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((POWER(5,7)),(POWER(6,(POWER(8,9)-1))-3))
-> done
   1^2^3
-> POWER(1,2)^3
-> POWER(POWER(1,2),3)
-> done