Java String.split()正则表达式

时间:2012-03-25 00:29:02

标签: java regex string split

我有一个字符串:

String str = "a + b - c * d / e < f > g >= h <= i == j";

我想在所有运算符上拆分字符串,但在数组中包含运算符,因此生成的数组如下所示:

[a , +,  b , -,  c , *,  d , /,  e , <,  f , >,  g , >=,  h , <=,  i , ==,  j]

我现在有这个:

public static void main(String[] args) {
    String str = "a + b - c * d / e < f > g >= h <= i == j";
    String reg = "((?<=[<=|>=|==|\\+|\\*|\\-|<|>|/|=])|(?=[<=|>=|==|\\+|\\*|\\-|<|>|/|=]))";

    String[] res = str.split(reg);
    System.out.println(Arrays.toString(res));
}

这非常接近,它给出了:

[a , +,  b , -,  c , *,  d , /,  e , <,  f , >,  g , >, =,  h , <, =,  i , =, =,  j]

我能做些什么来让多个字符操作符出现在数组中,就像我想要的那样?

作为次要问题并不是那么重要,在正则表达式中是否有办法从字母周围修剪空白?

6 个答案:

答案 0 :(得分:35)

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];

这应该这样做。一切都很好地存储在res

答案 1 :(得分:16)

str.split (" ") 
res27: Array[java.lang.String] = Array(a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j)

答案 2 :(得分:4)

    String str = "a + b - c * d / e < f > g >= h <= i == j";
    String reg = "\\s*[a-zA-Z]+";

    String[] res = str.split(reg);
    for (String out : res) {
        if (!"".equals(out)) {
            System.out.print(out);
        }
    }

输出:+ - * /&lt; &GT; &gt; =&lt; = ==

答案 3 :(得分:1)

您可以使用\ b

拆分字边界

答案 4 :(得分:0)

你可以将你的正则表达式反转为非操作字符吗?

String ops[] = string.split("[a-z]")
// ops == [+, -, *, /, <, >, >=, <=, == ]   

这显然不会返回数组中的变量。也许你可以交错两个分裂(一个由运算符,一个由变量)

答案 5 :(得分:-3)

您还可以执行以下操作:

String str = "a + b - c * d / e < f > g >= h <= i == j";
String[] arr = str.split("(?<=\\G(\\w+(?!\\w+)|==|<=|>=|\\+|/|\\*|-|(<|>)(?!=)))\\s*");

它处理空格和可变长度的单词并生成数组:

[a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j]