Java String.split()正则表达式拆分数学表达式

时间:2015-03-01 20:44:18

标签: java regex split expression

我有一个字符串:

"a + b - (2.5 * d / 2) < f > g >= h <= (i == j)"

目前我已经:

String[] ops = str.split("\\s*[a-zA-Z]+\\s*");
String[] notops = str.split("\\s*[^a-zA-Z]+\\s*");
String[] res = new String[ops.length+notops.length-1];
for(int i=0; i<res.length; i++) res[i] = i%2==0 ? notops[i/2] : ops[i/2+1];

但是这不会处理括号。而且它还分离出运算符和值,但我想要单个正则表达式,它将在上面分割如下:

[a, +, b, -, (, 2.5, *, d, /, 2, ), <, f, >, g, >=, h, <=, (, i, ==, j, )]

1 个答案:

答案 0 :(得分:4)

我认为这可能更容易表达为您尝试提取的令牌而不是拆分正则表达式。

String input = "-9 + a + b - (2.5 * d / 2) < f > g >= h <= (i == j) && (foo || bar)";
Pattern pattern = Pattern.compile("-?[0-9.]+|[A-Za-z]+|[-+*/()]|==|<=|>=|&&|[|]{2}");
Matcher match = pattern.matcher(input);
List<String> actual = new ArrayList<String>();
while (match.find()) {
    actual.add(match.group());
}
System.out.println(actual);

这为您提供了

之后的结果
[-9, +, a, +, b, -, (, 2.5, *, d, /, 2, ), f, g, >=, h, <=, (, i, ==, j, ), &&, (, foo, ||, bar, )]