在 C# 中标记表达式字符串
Tokenizing a expression string in C#
我有一个形式为
的计算公式字符串
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,2 这不是所需的结果。
我有变量列表和完整的分隔符(运算符)列表。
我想达到什么目的?
我正在尝试从表达式字符串中获取以下列表
List<string>() {"w_tb","+","Min","(","d_3",",","a_x",")","*","Pow","(","x",",","2",")"}
有什么方法可以完成任务。
我已经尝试过this答案中提到的解决方案。但是我拥有的分词器是一个字符串。
您正在尝试做的是编译器经常使用的称为解析。
您可以为表达式定义一个简单的语法,然后让 parser-generator 为您生成解析器代码。它允许您定义语法错误并提供您想要的完整标记列表。 Antlr 中的一个很好的例子。看看http://www.antlr.org/
所以我可以找到一种方法来完成我的任务。我有所有可用运算符的列表和所有可用操作数的列表。可以通过根据运算符字符串拆分公式字符串来获得操作数列表。
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 = "";
}
}
效率可能不高,但一定能完成任务。
我有一个形式为
的计算公式字符串 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,2 这不是所需的结果。
我有变量列表和完整的分隔符(运算符)列表。
我想达到什么目的?
我正在尝试从表达式字符串中获取以下列表
List<string>() {"w_tb","+","Min","(","d_3",",","a_x",")","*","Pow","(","x",",","2",")"}
有什么方法可以完成任务。
我已经尝试过this答案中提到的解决方案。但是我拥有的分词器是一个字符串。
您正在尝试做的是编译器经常使用的称为解析。
您可以为表达式定义一个简单的语法,然后让 parser-generator 为您生成解析器代码。它允许您定义语法错误并提供您想要的完整标记列表。 Antlr 中的一个很好的例子。看看http://www.antlr.org/
所以我可以找到一种方法来完成我的任务。我有所有可用运算符的列表和所有可用操作数的列表。可以通过根据运算符字符串拆分公式字符串来获得操作数列表。
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 = "";
}
}
效率可能不高,但一定能完成任务。