【问题标题】:Tokenizer/Split in c#?c#中的分词器/拆分?
【发布时间】:2013-05-08 00:46:34
【问题描述】:

我正在尝试将它从 java 转换为 C#,并且除了分词器之外几乎已经完成了所有工作。我知道您在 C# 中使用 split 但我似乎无法弄清楚。程序需要拆分用户输入的方程(4/5 + 3/4)是没有括号的格式。任何帮助都会很棒。

// read in values for object 3
Console.Write("Enter the expression (like 2/3 + 3/4 or 3 - 1/2): ");
string line = Console.ReadLine();

// Works with positives and neagative values!
// Split equation into first number/fraction, operator, second number/fraction
StringTokenizer st = new StringTokenizer(line, " ");
string first = st.nextToken();
char op = (st.nextToken()).charAt(0);
string second = st.nextToken();

稍后我将需要符号(+、-、* 或 /),并需要检查它是否是我在代码中紧随其后执行的整数。下面是我尝试过的一种,但我被字符卡住了。

char delimeters = ' ';
string[] tokens = line.Split(delimeters);
string first = tokens[0];
char c = tokens[1]

【问题讨论】:

  • 我不确定我是否理解你的问题是否正确,但我认为应该是char c = tokens[1][0]
  • 我不确定这是否可行?如果我需要澄清任何事情,请告诉我。
  • 顺便说一句,如果您要使用 float.Parse,请注意本地化。 (stackoverflow.com/questions/147801/best-way-to-parse-float)

标签: c# java split tokenize


【解决方案1】:

tokens 是一个字符串数组,所以 token[1] 是一个字符串,不能将字符串赋值给 char。这就是为什么在 javacode 中写成charAt(0)。将其转换为 C# 给出了

char delimeters = ' ';
string[] tokens = line.Split(delimeters);
string first = tokens[0];
char c = tokens[1][0];

【讨论】:

    【解决方案2】:

    相当于Java的

    String first = st.nextToken();
    char op = (st.nextToken()).charAt(0);
    String second = st.nextToken();
    

    string first = tokens[0];
    char c = tokens[1][0];
    string second = tokens[2];
    

    您很可能需要循环执行此操作。 first 将被读取一次,然后您将读取 operatoroperand,同时还有更多数据可用,如下所示:

    List<string> operands = new List<string> {tokens[0]};
    List<char> operators = new List<char>();
    for (int i = 1 ; i+1 < tokens.Length ; i += 2) {
        operators.Add(tokens[i][0]);
        operands.Add(tokens[i+1]);
    }
    

    在此循环之后,您的operators 将包含代表运算符的N 字符,而operands 将包含代表操作数的N+1 字符串。

    【讨论】:

      【解决方案3】:

      我只是编写了这个代码(即我没有尝试过)......但是你去吧。

      //you should end up with the following
      // tokens[0] is the first value, 2/3 or 3 in your example
      // tokens[1] is the operation, + or - in your example
      // tokens[2] is the second value, 3/4 or 1/2 in your example
      
      char delimeters = ' ';
      string[] tokens = line.Split(delimeters);
      
      
      char fractionDelimiter = '/';
      // get the first operand
      string first = tokens[0];
      bool result = int.TryParse(first, out whole);
      double operand1 = 0;
      
      //if this is a fraction we have more work...
      // we need to split again on the '/'
      if (result) {
         operand1 = (double)whole;
      } else {
         //make an assumption that this is a fraction
      
         string fractionParts = first.Split(fractionDelimiter);
         string numerator = fractionParts[0];
         string denominator = fractionParts[1];
         operand1 = int.Parse(numerator) / int.Parse(denominator);
      }
      
      // get the second operand
      string second = tokens[2];
      bool secondResult = int.TryParse(second, out secondWhole);
      double operand2 = 0;
      
      if (secondResult) {
         operand2 = (double)secondWhole;
      } else {
         //make an assumption that this is a fraction
      
         string secondFractionParts = second.Split(fractionDelimiter);
         string secondNumerator= secondFractionParts[0];
         string secondDenominator = secondFractionParts[1];
         operand2 = int.Parse(secondNumerator) / int.Parse(secondDenominator);
      }
      

      剩下的应该就像找出操作是什么并使用operand1和operand2进行工作一样简单

      【讨论】:

      • 操作数在尝试将其拆分为字符串数组时不会导致错误吗?这就是我的困惑。???
      • 这就是我首先投入 TryParse 的原因。如果 TryParse 成功,那么我们不需要拆分,并且将设置“out”值。如果 TryParse 不成功(它返回 false),那么我们可以推断出我们有一个斜线并且我们需要拆分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2017-04-11
      相关资源
      最近更新 更多