如何在运算符处拆分字符串

时间:2013-12-28 09:42:39

标签: java arrays string split calculator

我用Java创建一个计算器。

如果我让用户输入一个字符串,例如:

7+4-(18/3)/2

到目前为止,我必须让用户在每个号码或运营商之间输入一个空格。 我如何从给定的字符串创建一个数组,其中字符串被分割为数字或运算符,所以在这种情况下数组将是:

[7, +, 4, -, (, 18, /, 3, ), /, 2]

(数组的类型为String)

任何帮助都会非常感激

谢谢:)

4 个答案:

答案 0 :(得分:4)

试试这个:

String[] temp = expression.split("[\s+-\\\(\)]+");

会分开:

  • 白色空间
  • +运营商
  • -运营商
  • \字符
  • (字符
  • )字符

答案 1 :(得分:1)

我这样做的方法就是自己扫描一下这个字符串。无论如何,你都希望从结果中构建一个操作,这样你就不会通过使用自动解析器/拆分器等获得任何东西。

以下是代码的草图:

List<Operations> ops = new ArrayList();

for (int i=0;i<str.length();i++) {

   char c = str.get(i);
   if (c == '.' || c >= '0' || c<='9') {
       // extract a number, moving i onwards as I do 
       // insert number into ops (new Operation(num))
   } else if (c!= ' ') {
       Operator operator = operators.get(c);
       if (operator == null) {
           // Handle invalid input - could just skip it
       } else {
           // Add operator to ops
       }
   }
}

您需要为每个符号定义运算符。

完成后,您已解析出字符串以仅保存重要数据并编制了一系列操作列表。

现在你需要弄清楚如何处理应用正确的优先级规则等的操作列表:)最简单的方法可能就是每次执行每次有效的计算时重复遍历列表。

1+2*(3+4)-(4+2)

第一遍:

1+2*12-6

第二遍:

1+24-6

结果:

19

答案 2 :(得分:1)

您尚未指定要对阵列执行的操作。如果你真的想要评估表达式,那么已经有可用的库。你可以使用其中一个。但是如果你只想要一个类似于你所展示的阵列,那么我也不建议使用正则表达式。您可以编写自己的解析器方法,如下所示:

public static String[] parseExpression(String str) {
    List<String> list = new ArrayList<String>();
    StringBuilder currentDigits = new StringBuilder();

    for (char ch: str.toCharArray()) {
        if (Character.isDigit(ch)) {
            currentDigits.append(ch);
        } else {
            if (currentDigits.length() > 0) {
                list.add(currentDigits.toString());
                currentDigits = new StringBuilder();
            }
            list.add(String.valueOf(ch));
        }
    }

    if (currentDigits.length() > 0)
        list.add(currentDigits.toString());

    return list.toArray(new String[list.size()]);
}

现在称之为:

String str = "7+4-(18/3)/2";
System.out.println(Arrays.toString(parseExpression(str)));

你会得到你的结果。

答案 3 :(得分:0)

我的第一次尝试是使用"\b",但没有拆分-(。经过一番搜索,我想出了这个:

(?<=[\(\)\+\-*\/\^A-Za-z])|(?=[\(\)\+\-*\/\^A-Za-z])

所以,你必须逃避它并像这样使用它:

String input = ...;
String temp[] = input.split("(?<=[\\(\\)\\+\\-*\\/\\^A-Za-z])|(?=[\\(\\)\\+\\-*\\/\\^A-Za-z])");
System.out.println(Arrays.toString(temp));

输入:

7+4-(18/3)/2a^222+1ab

输出:

[7, +, 4, -, (, 18, /, 3, ), /, 2, a, ^, 222, +, 1, a, b]

在此见到它:
http://rubular.com/r/uHAObPwaln
http://ideone.com/GLFmo4