为什么String.split()在这里返回额外的元素?

Raj*_*Raj 1 java regex

我试图使用regexp分割一个字符串,它返回数组中的额外元素.请帮忙.以下是该计划:

public class Test {
    public static void main(String[] arg){
    String str1 = "{abc}{def}";
    String delim = "[{}]+";

    String[] tokens = str1.split(delim);

    for (int i = 0; i < tokens.length; i++) {
        System.out.println("token value: "+ tokens[i]);
        }        
    }    
}
Run Code Online (Sandbox Code Playgroud)

输出:

token value: 
token value: abc
token value: def
Run Code Online (Sandbox Code Playgroud)

为什么第一个令牌空字符串?怎么解决这个问题?

T.J*_*der 5

你有空的初始元素的原因是目标字符串以分隔符开头.所以就像分割",1,2",会导致三个项目,第一个是空白的,你得到同样的结果.(你不会在得到一个空白结束,因为String#split明确地删除它们,除非你给它一个负的第二个参数.)

如果你知道字符串将以分隔符开头并且它是一个字符,只需删除它:

String[] tokens = str1.substring(1).split(delim);
Run Code Online (Sandbox Code Playgroud)

编辑:或者对于一般情况,请参阅波希米亚的答案,他删除第一个匹配的delim,无论长度如何.

否则,你可以循环:

import java.util.regex.*;

public class SplitTest {
    public static void main(String[] arg){
        String str1 = "{abc}{def}";

        Matcher m = Pattern.compile("\\{([^}]+)\\}").matcher(str1);
        while (m.find()) {
            System.out.println("token value: " + m.group(1));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是该模式字符串的细分:

  • \\{开头相匹配的文字{
  • (和相应)会创建一个捕获组
  • 在捕获组内,[^}]+意味着"任何不是a的字符中的一个或多个}
  • 尾随\\}匹配文字}

然后我们循环遍历字符串中的匹配项,获取捕获组的值