【问题标题】:Splitting input string for a calculator拆分计算器的输入字符串
【发布时间】:2012-01-09 17:42:58
【问题描述】:

我正在尝试拆分用户为我的计算器提供的输入。 例如, 如果用户输入“23+45*(1+1)”,我希望将其拆分为 [23,+,45,*,(,1,+,1,)]。

【问题讨论】:

    标签: java string split expression


    【解决方案1】:

    您要查找的内容称为词法分析器lexer 将输入拆分为您可以阅读的块(称为 tokens)。

    幸运的是,您的词法分析器非常简单,可以手动编写。对于更复杂的词法分析器,您可以使用flex(如“快速词法分析器”--不是 Adob​​e Flex),或者(因为您使用的是 Java)ANTLR(注意,ANTLR 不仅仅是一个词法分析器)。

    只需提供一个正则表达式列表,每个标记匹配一个(请注意,由于您的输入非常简单,您可能可以取消此列表并将它们全部合并到一个正则表达式中。但是,对于更多高级词法分析器,它有助于为每个标记做一个正则表达式)例如

    \d+
    \+
    -
    *
    /
    \(
    \)
    

    然后开始一个循环:当有更多的字符需要解析时,遍历每个正则表达式并尝试将它们与字符串的开头进行匹配。如果它们匹配,则将第一个匹配的组添加到您的输入列表中。否则,继续匹配(如果没有一个匹配,告诉用户他们有语法错误)。

    伪代码:

    List<String>input = new LinkedList<String>();
    while(userInputString.length()>0){
        for (final Pattern p : myRegexes){
            final Matcher m = p.matcher(userInputString);
            if(m.find()) {
                input.add(m.group());
                //Remove the token we found from the user's input string so that we
                //can match the rest of the string against our regular expressions.
                userInputString=userInputString.substring(m.group().length());
                break;
            }
        }
    }
    

    实施说明:

    • 您可能希望将^ 字符添加到所有正则表达式中。这可以确保您将匹配项锚定在字符串的开头。我的伪代码假设你已经这样做了。

    【讨论】:

      【解决方案2】:

      我认为使用 stacks 来拆分操作数和运算符并评估表达式会更合适。在计算器中我们一般使用中缀符号来定义算术表达式。

      Operand1 op Operand2
      

      检查在许多此类情况下使用的Shunting-yard algorithm 来解析数学表达式。 This 也不错。

      【讨论】:

        【解决方案3】:

        这可能有点草率,因为我还在学习,但它确实将它们拆分成字符串。

        公共类TestClass {

        public static void main(String[] args)
        {
            Scanner sc = new Scanner(System.in);
            ArrayList<String> separatedInput = new ArrayList<String>();
            String input = "";
        
            System.out.print("Values: ");
            input = sc.next();
        
            if (input.length() != 0)
            {
                boolean numberValue = true;
                String numbers = "";
        
                for (int i = 0; i < input.length(); i++)
                {
                    char ch = input.charAt(i);
                    String value = input.substring(i, i+1);
        
                    if (Character.isDigit(ch))
                    { numberValue = true; numbers = numbers + value; }
        
                    if (!numberValue)
                    { separatedInput.add(numbers); separatedInput.add(value); numbers = ""; }
                    numberValue = false;
        
                    if (i == input.length() - 1)
                    {
                        if (Character.isDigit(ch))
                        { separatedInput.add(numbers); }
                    }
                }
        
            }
            System.out.println(separatedInput);
         }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-03
          • 2021-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多