我正在开发Visual Basic中的计算器功能。我认为默认的.NET库中没有基本的。
我使用System.Data.DataTable.Compute()
来计算正常的Math表达式。但是我希望我的函数能够解决像Sinus()或Round()这样的函数。
目前我正在使用正则表达式。例如,对于带有一个参数的函数,我使用
Dim expr As String = Regex.Replace(Term, "(?<func>[A-Za-z]*?)\((?<arg1>[0-9,.]*?)\)", AddressOf FunctionLibrary.Funcs1)
Sinus()函数如下所示:sin(Number)
。
但这只允许在参数中写入双打或整数。我不能在括号之间写内部函数或甚至是另一个数学表达式。
如果我将更多函数作为参数写入,Regex将检测函数内部的第一个“)”,它是内部函数的右括号,作为外部函数的结尾。
有没有办法让Regex认识到这也是一个内在的功能?
如果有人知道默认.NET库中的Visual Basic的Evaluate()函数,这对我也有帮助
答案 0 :(得分:1)
有没有办法让Regex认识到这也是一个内在的功能?
不,没有。正则表达式,顾名思义,解决Regular语法和简单数学表达式Context-Free。正则表达式没有堆栈来匹配任意表达式。例如,区分(())
和()()
至少需要一个前瞻(或回溯)字符。是的,PCRE风格的正则表达式可以让你创建固定数量的前瞻字符,但据我所知你必须指定字符数,无论如何这不会解决你的问题。
评估算术表达式需要处理优先级,子表达式,可能的变量和类型。正则表达式不能这样做,尝试使用正则表达式会导致陷入失败。
他们甚至不需要。评估数学表达式是一个已解决的问题,并且有许多解析器和评估程序已编写,测试并准备好供您使用。您没有给我们足够的信息来决定哪一个最适合您,而且Stack Overflow也不是工具倡导网站。你可以先看一下Gary Beene的Equation Parser评论列表。