Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于正则表达式的数值表达式求解器_C#_Regex_Math - Fatal编程技术网

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:我已经这样做了,但我的一位朋友建议也可以使用正则表达式,所以我不这么认为我会记住他的方法,这很有趣。不过,这只是一个实验,为什么不试试看呢?当然可以,但一定要记住我们的常见问题:“你应该根据你所面临的实际问题提出切实可行的、可回答的问题。”非常好的方法,谢谢!但这并不是我想要的。这个解算器将是一种考试论文,所以我不允许像这样“作弊:)不过,你的答案是惊人的!