【问题标题】:How to parse string with Java?如何用Java解析字符串?
【发布时间】:2011-11-14 01:24:51
【问题描述】:

我正在尝试制作一个简单的计算器应用程序,它会采用这样的字符串

5 + 4 + 3 - 2 - 10 + 15

我需要 Java 将这个字符串解析成一个数组

{5, +4, +3, -2, -10, +15}

假设用户可以在每个数字和每个运算符之间输入 0 个或多个空格

我是 Java 新手,所以我不完全确定如何做到这一点。

【问题讨论】:

  • 最简单的方法是使用正则表达式(MatcherPattern 类)。话虽这么说,你确定这真的是你想做的吗?你会用这两个数组做什么?
  • 我猜这超出了规范。你的家庭作业,但是(解析和)评估String简单方法是使用ScriptEngine,如this example所示。

标签: java regex parsing


【解决方案1】:

您可以使用 Integer.parseInt 来获取值,拆分字符串可以使用 String 类实现。正则表达式可以工作,但我不知道该怎么做:3

【讨论】:

    【解决方案2】:

    看看String.split()

    String str = "1 + 2";
    System.out.println(java.util.Arrays.toString(str.split(" ")));
    

    [1, +, 2]

    请注意,拆分使用正则表达式,因此您必须将要拆分的字符引用为“。”或具有特殊含义的类似字符。此外,一行中的多个空格会在解析数组中创建空字符串,您需要跳过。

    这解决了简单的例子。为了更严格地解析真正的表达式,您需要创建一个语法并使用 Antlr 之类的东西。

    【讨论】:

      【解决方案3】:

      str 成为你的行缓冲区。

      将 Regex.match 用于模式 ([-+]?[ \t]*[0-9]+)

      将所有匹配累积到String[] tokens

      然后,对于tokens 中的每个token

      String s[] = tokens[i].split(" +");
      if (s.length > 1)
          tokens[i] = s[0] + s[1];
      else
          tokens[i] = s[0];
      

      【讨论】:

        【解决方案4】:

        您可以使用积极的后视:

            String s = "5  +  4  +  3   -   2 - 10 + 15";
            Pattern p = Pattern.compile("(?<=[0-9]) +");
            String[] result = p.split(s);
        
            for(String ss : result)
                System.out.println(ss.replaceAll(" ", ""));
        

        【讨论】:

          【解决方案5】:
              String cal = "5 + 4 + 3 - 2 - 10 + 15";
              //matches combinations of '+' or '-', whitespace, number
              Pattern pat = Pattern.compile("[-+]{1}\\s*\\d+");
              Matcher mat = pat.matcher(cal);
              List<String> ops = new ArrayList<String>();
              while(mat.find())
              {
                  ops.add(mat.group());
              }
              //gets first number and puts in beginning of List
              ops.add(0, cal.substring(0, cal.indexOf(" ")));
          
              for(int i = 0; i < ops.size(); i++)
              {
                  //remove whitespace
                  ops.set(i, ops.get(i).replaceAll("\\s*", ""));
              }
          
              System.out.println(Arrays.toString(ops.toArray()));
              //[5, +4, +3, -2, -10, +15]
          

          【讨论】:

            【解决方案6】:

            根据此处输入的一些答案,我发现这是最好的解决方案

            // input
            String s = "5 + 4 + 3 - 2 - 10 + 15";
            ArrayList<Integer> numbers = new ArrayList<Integer>();
            
            // remove whitespace
            s = s.replaceAll("\\s+", "");
            
            // parse string
            Pattern pattern = Pattern.compile("[-]?\\d+");
            Matcher matcher = pattern.matcher(s);
            
            // add numbers to array
            while (matcher.find()) {
              numbers.add(Integer.parseInt(matcher.group()));
            }
            
            // numbers
            // {5, 4, 3, -2, -10, 15}
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-02
              • 2012-11-04
              • 2012-05-25
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多