如何防止java.lang.String.split()创建一个前导空字符串?

mar*_*hon 56 java string

传递0作为限制参数可以防止尾随空字符串,但是如何防止前导空字符串?

例如

String[] test = "/Test/Stuff".split("/");
Run Code Online (Sandbox Code Playgroud)

产生一个带有"","测试","东西"的数组.

是的,我知道我可以推出自己的Tokenizer ...但是StringTokenizer的API文档说

"StringTokenizer是一个遗留类,出于兼容性原因而保留,但在新代码中不鼓励使用它.建议任何寻求此功能的人都使用拆分"

Joe*_*rdi 46

你最好的选择可能只是删除任何前导分隔符:

String input = "/Test/Stuff";
String[] test = input.replaceFirst("^/", "").split("/");
Run Code Online (Sandbox Code Playgroud)

你可以把它放在一个方法中,使它更通用:

public String[] mySplit(final String input, final String delim)
{
    return input.replaceFirst("^" + delim, "").split(delim);
}

String[] test = mySplit("/Test/Stuff", "/");
Run Code Online (Sandbox Code Playgroud)


adr*_*ale 22

Apache Commons有一个实用方法,正是如此: org.apache.commons.lang.StringUtils.split

StringUtils.split()

实际上在我们公司,我们现在更喜欢使用这种方法来分割我们所有的项目.

  • 似乎不支持像JDK版本那样的正则表达式. (2认同)

Hun*_*len 6

我不认为你有办法用内置split方法做到这一点.所以你有两个选择:

1)自己分手

2)在调用split后迭代数组并删除空元素

如果你自己进行拆分,你可以将这两个选项结合起来

public List<String> split(String inString)
{
   List<String> outList = new ArrayList<>();
   String[]     test    = inString.split("/");

   for(String s : test)
   {
       if(s != null && s.length() > 0)
           outList.add(s);
   }

   return outList;
}
Run Code Online (Sandbox Code Playgroud)

或者你可以在调用split之前检查分隔符是否在第一个位置,如果是,则忽略第一个字符:

String   delimiter       = "/";
String   delimitedString = "/Test/Stuff";
String[] test;

if(delimitedString.startsWith(delimiter)){
    //start at the 1st character not the 0th
    test = delimitedString.substring(1).split(delimiter); 
}
else
    test = delimitedString.split(delimiter);
Run Code Online (Sandbox Code Playgroud)