使用算术运算解析字符串

时间:2013-12-11 17:40:19

标签: c# string-parsing

我有一个以下类型的字符串:

"23 + 323 =" or "243 - 3 ="

因此格式为:number + operator + number = equal

我也有一个int就是这个问题的答案。

如何解析字符串并检查答案是否正确?

谢谢你, 米格尔

4 个答案:

答案 0 :(得分:3)

也许使用正则表达式可以做类似......

String sExpression = "23 + 323 =";
int nResult = 0;
Match oMatch = Regex.Match(@"(\d+)\s*([+-*/])\s*(\d+)(\s*=)?")
if(oMatch.Success)
{
    int a = Convert.ToInt32(oMatch.Groups[1].Value);
    int b = Convert.ToInt32(oMatch.Groups[3].Value);
    switch(oMatch.Groups[2].Value)
    {
        case '+';
            nResult = a + b;
            break;
        case '-';
            nResult = a - b;
            break;
        case '*';
            nResult = a * b;
            break;
        case '/';
            nResult = a / b;
            break;
    }
}

并扩展到您的需要..(浮点数,其他运算符,验证等)

答案 1 :(得分:0)

您希望拆分等于然后拆分运算符。然后,您可以使用一些标准的字符串处理技术来执行操作并根据答案进行检查。可能会有比这更有效和/或更清洁的解决方案,这只是第一个触手可及的,因为你没有发布任何代码,这就是你得到的。请注意,这也不灵活。它仅在有两个操作数和四个主要算术运算符时才有效。除非有一些要求说你不使用第三方库,否则我建议你在评论中使用类似链接的内容。如果你需要在更广泛的意义上实现它(使用像(x + y - z)* x这样的多个操作)那么你还有更多的工作要做。

 string input = "23 + 323 = 346";

 string[] sides = input.Split('=');
 string[] operands;
 int answer = 0;

 if (sides.Length == 2)
 {
      if (sides[0].Contains('+'))
      {
          operands = sides[0].Split('+');
          operands[0].Trim();
          operands[1].Trim();
          answer = int.Parse(operands[0]) + int.Parse(operands[1]);
          // note if you're serious about error handling use tryparse to ensure the values are integers
          if (answer != int.Parse(sides[1].Trim()))
             // answer is wrong
      }
      else if (sides[0].Contains('-'))
      {
          // same logic
      }
 }
 else
      //input formatting error

答案 2 :(得分:0)

正如您的问题的所有注释所示,您需要某种标记化器,表达式解析器和表达式求值程序。

标记生成器将源字符串拆分为单独的标记,如数字和运算符。

表达式解析器扫描并语法分析标记序列,识别表达式并构建某种解析树(即抽象表达式树)。

表达式赋值器然后遍历结果表达式树的节点,评估二元和一元子表达式。结果是评估树中最顶层的节点。

这是一组相当复杂的事情,所以(就像其他评论所说的那样),你应该尝试找一个已经写过的图书馆来为你做这一切。

答案 3 :(得分:0)

实际上它与解析单个算术表达式没有什么不同。在这里,您只需评估其中两个(在等号的两侧),然后检查结果。

好吧,你可以去疯狂",不仅解析=而且解析>>=,这会给你更大的灵活性。

因为在算术表达式中,括号应该是合法的(常识),例如(5+2)*3,你应该避免与正则表达式和类似的方法斗争并与解析器一起使用。

选择一个你觉得舒服的人,GOLD,ANTLR,Cocoa。我自己的解析器(生成器) - NLT - 包含已经算术的表达式示例。添加单个规则来检查相等性,您就可以开始了。