我有一个
形式的计算公式字符串 string formula = w_tb + Min(d_3,a_x) * Pow(x,2)
在上面的示例中,w_tb, d_3, a_x, x
是变量。我可以通过使用操作数作为分隔符拆分字符串来查找公式中的变量列表。
但是为了将值赋给变量(来自数据库的值),我的第一种方法是用数据库中的变量值替换变量名。但这会导致甚至用值替换表达式字符串的子串。例如:如果变量x被表达式字符串中的值1,2替换,则a_x将被替换为a_1,这不是必需的结果。
我有变量列表和完整的分隔符列表(运算符)。
我想要实现的目标是什么?
我想从表达式字符串
中获取以下列表List<string>() {"w_tb","+","Min","(","d_3",",","a_x",")","*","Pow","(","x",",","2",")"}
我有没有办法完成任务。
我已经尝试了this回答中提到的解决方案。但我拥有的标记器是一个字符串。
答案 0 :(得分:4)
您尝试做的事情称为解析,经常被编译器使用。
您可以为表达式定义一个简单的语法,让解析器生成器为您生成解析器代码。它允许您定义语法错误并提供完整的令牌列表,就像您想要的那样。 Antlr的一个很好的例子。看看http://www.antlr.org/
答案 1 :(得分:0)
所以我可以找到一种方法来完成我的任务。我有一个所有可用运算符的列表和所有可用操作数的列表。可以通过基于运算符字符串拆分公式字符串来获取操作数列表。
var Operatorlist = new string[] { "Min", "Max", "Abs", "Pow", "+", "-", "*", "/", "(", ")", "²", "³", "Length", " ", "\r", "\n", ",", "[", "]", "Sqrt", "Cubrt", "^" };
string[] formulaSplit = formula.Split(Operatorlist,StringSplitOption.None);
现在解析公式以获取操作数和运算符列表
string sb="";
var formlist = new list<string>();
foreach(var c in calc.CalculationFormula)
{
sb = sb + c;
if(delimstringlist.Contains(sb))
{
formlist.Add(sb);
sb = "";
}
else if(formulaSplit.Contains(sb))
{
formlist.Add(sb);
sb = "";
}
}
可能效率不高,但肯定会完成任务。