2013-02-13 83 views
0

我正在寻找使用正则表达式的数学公式验证。 下面是我使用的示例代码: -如何使用正则表达式验证数学公式表达式

string equation = "(a+b)*10"; 

bool b = false; 

Regex rx = new Regex(@"^((?<o1>[^-+*/()]+|\([^-+*/()]+\)|(?<p>\()+[^-+*/()]+|[^-+*/()]+(?<-p>\)))[-+*/])+(?<o2>[^-+*/()]+|\([^-+*/()]+\)|(?<p>\()+[^-+*/()]+|[^-+*/()]+(?<-p>\)))(?(p)(?!))$"); 

if (rx.IsMatch(equation)) 
    { 
     b = true; 
    } 

它工作正常与用于类似的表述“(A + B)×100”。我的意思是如果我错误地放置了诸如“(a + b))* 100”或“(a + b * 100”或“(a + b)* 100)”的花括号,那么它会进行完美的验证。但是,如果去引入我的用户定义的函数,如“Sum(1,2)”或Sqrt(8),则无法验证。

我想这也验证我的功能。像“Sum(1,2)”,“Sum(1,2”,“Sum1,2)”,“Sum(1,2))”一样。我的意思是它应该照顾正确使用大括号。

注意: - 我正在使用ANTLR创建这些功能。

谢谢

+0

数学表达式不是常规语法,不能使用正则表达式进行分析 – Eric 2013-02-13 07:56:13

+1

您正在使用哪种语言运行该正则表达式? – Eric 2013-02-13 07:58:26

+0

@Eric我正在使用C# – Girish 2013-02-13 09:23:05

回答

0

通用的数学公式太复杂,不能用正则表达式解析。使用ANTLR编写一个可以解析出单个元素的语法。

+0

你能否向我提供一些链接,从那里我可以得到如何编写这种类型的验证的参考。我试图搜索很多选项,但事情并不令人满意。 – Girish 2013-02-15 04:47:45

+0

那么你最好的选择是购买最终的ANTLR4参考书,因为书写语法不是世界上最简单的事情。然而,如果你不能这样做,那么在http://media.pragprog.com/titles/tpantlr2/code/tpantlr2-code.tgz上的图书的源代码中有'tour/ActionExpr中的语法。 g4',它与你试图解析的语法有相似的语法。 – jgm 2013-02-15 10:06:15