C# 基于正则表达式的数值表达式求解器
我正在用正则表达式做一个简单的数值表达式求解器,现在我正在把多项式分解成它的项。这就是我到目前为止得到的结果:C# 基于正则表达式的数值表达式求解器,c#,regex,math,C#,Regex,Math,我正在用正则表达式做一个简单的数值表达式求解器,现在我正在把多项式分解成它的项。这就是我到目前为止得到的结果: (.*?)([\+-](.*?))+ 当涉及负数时,这不起作用。以3*-2+1为例:我得到的术语是3*、-2和+1,这显然是错误的。 我想我可以在标志前向后看一眼,这样前面有*或/的标志就会被丢弃: (.*?)((?<![\*/])[\+-](.*?))+ (*)(?)? 但这甚至不适用于正数 建议?希望您没有花太多时间创建自己的解析器;) 我使用以下代码计算表达式: cla
(.*?)([\+-](.*?))+
当涉及负数时,这不起作用。以3*-2+1为例:我得到的术语是3*、-2和+1,这显然是错误的。我想我可以在标志前向后看一眼,这样前面有*或/的标志就会被丢弃:
(.*?)((?<![\*/])[\+-](.*?))+
(*)(?)?
但这甚至不适用于正数
建议?希望您没有花太多时间创建自己的解析器;)
我使用以下代码计算表达式:
class Program
{
public static double Evaluate(string expression)
{
using (var stringReader = new StringReader("<dummy/>"))
{
var navigator = new XPathDocument(stringReader).CreateNavigator();
expression = Regex.Replace(expression, @"([\+\-\*])", " ${1} "); // add some space
expression = expression.Replace("/", " div ").Replace("%", " mod ");
return (double)navigator.Evaluate(string.Format("number({0})", expression));
}
}
static void Main(string[] args)
{
Console.WriteLine(Evaluate("3*-2+1"));
}
}
类程序
{
公共静态双重求值(字符串表达式)
{
使用(var stringReader=newstringreader(“”)
{
var navigator=新的XPathDocument(stringReader).CreateNavigator();
expression=Regex.Replace(表达式@“([\+\-\*]),“${1}”);//添加一些空格
表达式=表达式。替换(“/”,“div”)。替换(“%”,“mod”);
return(double)navigator.Evaluate(string.Format(“number({0})”,表达式));
}
}
静态void Main(字符串[]参数)
{
控制台写入线(评估(“3*-2+1”);
}
}
将输出:-5
它基于该方法。正则表达式在输入中添加一些空格,然后替换除法和模符号。我认为正则表达式并不特别适合解析此类表达式。为什么不编写自己的解析器呢?@Oded:我已经这样做了,但我的一位朋友建议也可以使用正则表达式,所以我不这么认为我会记住他的方法,这很有趣。不过,这只是一个实验,为什么不试试看呢?当然可以,但一定要记住我们的常见问题:“你应该根据你所面临的实际问题提出切实可行的、可回答的问题。”非常好的方法,谢谢!但这并不是我想要的。这个解算器将是一种考试论文,所以我不允许像这样“作弊:)不过,你的答案是惊人的!