我正在使用正则表达式创建一个简单的数值表达式求解器,现在我正在将多项式分解为它的术语。所以这就是我到目前为止所得到的:
(.*?)([\+-](.*?))+
当涉及负数时,这不起作用。以3 * -2 + 1为例:我得到的术语是3 *, - 2和+1,这显然是错误的 我以为我可以在标志前面看到负面的外观,以便*或/之前的标志被丢弃:
(.*?)((?<![\*/])[\+-](.*?))+
但这甚至不适用于正数
建议?
答案 0 :(得分:3)
希望你没有花很多时间创建自己的解析器;)
我使用此代码来计算表达式:
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"));
}
}
将输出:-5
它基于XPathNavigator.Evaluate
方法。正则表达式为输入添加了一些空格,然后替换了除法和模数符号。