我正在使用正则表达式制作一个简单的数值表达式求解器,现在我正在将多项式拆分为其项。所以这就是我到目前为止得到的:
(.*?)([\+-](.*?))+
当涉及负数时,这不起作用。以 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"));
}
}
将输出:-5
它基于XPathNavigator.Evaluate
方法。正则表达式在输入中添加一些空格,然后替换除法和模符号。