Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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/3/android/205.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#_String Parsing - Fatal编程技术网

C# 用算术运算分析字符串

C# 用算术运算分析字符串,c#,string-parsing,C#,String Parsing,我有以下类型的字符串: "23 + 323 =" or "243 - 3 =" 所以格式是:number+运算符+number=equal 我还有一个int,它是这个问题的答案 如何解析字符串并检查答案是否正确 谢谢,, Miguel您要在等于上拆分,然后在运算符上拆分。然后,您可以使用一些标准的字符串处理技术来执行该操作,并根据答案进行检查。可能还有比这更高效和/或更清洁的解决方案,这只是我指尖上的第一个解决方案,因为你没有发布任何代码,这就是你得到的。请注意,这也是不灵活的。它仅在有两个操

我有以下类型的字符串:

"23 + 323 =" or "243 - 3 ="
所以格式是:
number+运算符+number=equal

我还有一个int,它是这个问题的答案

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

谢谢,,
Miguel

您要在等于上拆分,然后在运算符上拆分。然后,您可以使用一些标准的字符串处理技术来执行该操作,并根据答案进行检查。可能还有比这更高效和/或更清洁的解决方案,这只是我指尖上的第一个解决方案,因为你没有发布任何代码,这就是你得到的。请注意,这也是不灵活的。它仅在有两个操作数且有四个主要算术运算符时才起作用。除非有要求说你不使用第三方库,否则我建议你使用类似于评论中链接的东西。如果您需要在更一般的意义上实现这一点(与(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

也许使用正则表达式你可以做一些像

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;
    }
}

并扩展到您的需要。。(浮动、其他运算符、验证等)

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

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

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

表达式计算器然后遍历结果表达式树的节点,计算二元和一元子表达式。结果是对树中最顶端节点的求值


这是一系列非常复杂的事情要做,所以(像其他注释状态一样),您应该尝试找到一个已经有人编写的库来为您完成所有这些工作。

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

好吧,你可以“疯狂”,不仅解析
=
,而且解析
>
=
,这将给你更多的灵活性

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


挑一个你觉得舒服的,黄金,蚂蚁,可可。我自己的解析器(生成器)——已经包含算术表达式示例。添加一条检查相等性的规则,您就可以开始了。

查看。将第一个和第三个令牌转换为int,并在两者之间切换运算符。请参见此处:what I!我喜欢你的解决方案并想使用它,如果我有一个指向某个文件的路径来进行计算,那么我应该在匹配语句中用什么来代替“\d”呢?你将如何对文件路径进行算术运算?这是我已经处理过的部分,我已经对它进行了分割,这是一个巨大的3D矩阵,我正在使用xml文件进行分割。不管怎么说,那部分是我最小的问题。我在考虑使用您的解决方案,但不是读取路径、操作数和整数值的一堆字符。我正在用Scala编写这个程序。如果你只需要这个技术,就可以解析一些字符串。。你可以根据自己的喜好修改正则表达式,但如果你不知道我是如何建议你先准备好一点RX的