[英]How to split string at operators
我用Java创建了一个计算器。
如果我有用户输入一个字符串,例如:
7+4-(18/3)/2
到目前为止,我不得不让用户在每个数字或运算符之间输入一个空格。 我如何从给定的字符串创建一个数组,其中该字符串按数字或运算符拆分,因此在这种情况下,数组为:
[7, +, 4, -, (, 18, /, 3, ), /, 2]
(数组的类型为String)
任何帮助将非常感激
谢谢 :)
尝试这个:
String[] temp = expression.split("[\s+-\\\(\)]+");
将分割:
+
运算符 -
运营商 \\
字符 (
字符 )
字符 老实说,我要做的就是自己扫描字符串。 无论如何,您都将要根据结果构建一个运算,因此使用自动解析器/拆分器/等并不会真正获得任何收益。
这是代码的草图:
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
您尚未指定要对数组执行的操作。 如果您真的想对表达式求值,则已经有适用于该表达式的库。 您可以使用其中之一。 但是,如果您只想要一个像您展示的那样的数组,那么我也不建议使用正则表达式。 您可以编写自己的解析器方法,如下所示:
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)));
您将得到结果。
我的第一次尝试是使用"\\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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.