我挑战你写一个数学表达式评估器,它尊重PEMDAS(操作顺序:括号,取幂,乘法,除法,加法,减法)而不使用正则表达式,一个预先存在的"Eval()" - 类似函数,一个解析库等
我在SO(这里)看到了一个预先存在的评估者挑战,但那个特别需要从左到右的评估.
样本输入和输出:
"-1^(-3*4/-6)" -> "1"
"-2^(2^(4-1))" -> "256"
"2*6/4^2*4/3" -> "1"
Run Code Online (Sandbox Code Playgroud)
我在C#中编写了一个评估器,但是我想看看它与那些选择语言的智能程序员相比有多糟糕.
澄清:
让我们使这个函数接受一个字符串参数并返回一个字符串结果.
至于为什么没有正则表达式,那就是平衡竞争环境.我认为"最紧凑的正则表达式"应该有一个单独的挑战.
使用StrToFloat()是可以接受的.通过"解析库",我的意思是排除诸如通用语法解析器之类的东西,也用于平衡游戏场.
支持浮动.
支持paretheses,取幂和四个算术运算符.
赋予乘法和除法优先权.
赋予加法和减法相同的优先权.
为简单起见,您可以假设所有输入都是格式良好的.
我不喜欢你的函数是否接受".1"或"1e3"之类的东西作为有效数字,但是接受它们会获得布朗尼积分.;)
对于除零情况,您可能会返回"NaN"(假设您希望实现错误处理).
我正在使用各种正则表达式循环遍历数千个字符串以检查简单错误.我想添加一个正则表达式来检查逗号的正确使用.
如果我的一个字符串中存在逗号,那么它必须后跟空格或正好三位数:
但是如果逗号后跟任何其他模式,那么这是一个错误:
到目前为止,我提出的最好的正则表达式是:
Regex CommaError = new Regex(@",(^(\d\d\d)|\S)"); // fails case #2
为了测试,我正在使用:
if (CommaError.IsMatch(", ")) // should NOT match
Console.WriteLine("failed case #1");
if (CommaError.IsMatch(",234")) // should NOT match
Console.WriteLine("failed case #2");
if (!CommaError.IsMatch("0,a")) // should match
Console.WriteLine("failed case #3");
if (!CommaError.IsMatch("0,0")) // should match
Console.WriteLine("failed case #4");
if (!CommaError.IsMatch("0,0a1")) // should match
Console.WriteLine("failed case #5");
Run Code Online (Sandbox Code Playgroud)
但是我上面给出的正则表达式失败了#2(当它不应该匹配时).
我花了几个小时调查这个,并在网上寻找类似的正则表达式,但已经碰到了一堵砖墙.我的正则表达式有什么问题?
更新:彼得发布了一个评论正则表达式按我想要的方式工作:
Regex CommaError = new Regex(@",(?!\d\d\d|\s)");
Run Code Online (Sandbox Code Playgroud)
编辑:好吧,差不多.在这种情况下失败:
if (!CommaError.IsMatch("1,2345")) …Run Code Online (Sandbox Code Playgroud)