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

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

例如

String[] test = "/Test/Stuff".split("/");

结果是带有“”,“ Test”,“ Stuff”的数组。

是的,我知道我可以滚动自己的令牌生成器...但是StringTokenizer的API文档说

“ StringTokenizer是一个遗留类,为保持兼容性而保留   原因,尽管在新代码中不鼓励使用它。 推荐   任何寻求此功能的人都会使用拆分”

marathon asked 2019-11-17T18:33:23Z
7个解决方案
46 votes

您最好的选择可能只是删除任何领先的定界符:

String input = "/Test/Stuff";
String[] test = input.replaceFirst("^/", "").split("/");

您可以通过以下方法使其更通用:

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

String[] test = mySplit("/Test/Stuff", "/");
Joe Attardi answered 2019-11-17T18:33:53Z
21 votes

Apache Commons拥有一个实用工具方法即可:org.apache.commons.lang.StringUtils.split

StringUtils.split()

实际上,在我们公司中,我们现在更喜欢在所有项目中使用此方法进行拆分。

adranale answered 2019-11-17T18:34:30Z
6 votes

我认为无法使用内置的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;
}

或者,您可以在调用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);
Hunter McMillen answered 2019-11-17T18:35:19Z
1 votes

我认为您必须手动删除第一个空字符串。 一种简单的方法是-

  String string, subString;
  int index;
  String[] test;

  string = "/Test/Stuff";
  index  = string.indexOf("/");
  subString = string.substring(index+1);

  test = subString.split("/"); 

这将排除前导空字符串。

CodeBlue answered 2019-11-17T18:35:49Z
1 votes

我认为没有内置函数可以删除Java中的空白字符串。 您可以消除空白的删除字符串,但这可能会导致错误。 为了安全起见,您可以按照以下方式编写一小段代码:

  List<String> list = new ArrayList<String>();

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

  test = stringList.toArray(new String[list.size()]);
codeit answered 2019-11-17T18:36:13Z
0 votes

您可以为此使用StringTokenizer ...

String test1 = "/Test/Stuff";
        StringTokenizer st = new StringTokenizer(test1,"/");
        while(st.hasMoreTokens())
            System.out.println(st.nextToken());
Shashank Kadne answered 2019-11-17T18:36:37Z
0 votes

这就是我解决这个问题的方法。 我获取字符串,在其上调用.toCharArray()以将其拆分为一个char数组,然后遍历该数组并将其添加到我的String列表中(用String.valueOf包裹每个char)。 我想在性能上要进行权衡,但这似乎是一种可读的解决方案。 希望这可以帮助!

 char[] stringChars = string.toCharArray(); 
 List<String> stringList = new ArrayList<>(); 

 for (char stringChar : stringChars) { 
      stringList.add(String.valueOf(stringChar)); 
 }
K. George Pradhan answered 2019-11-17T18:37:02Z
translate from https://stackoverflow.com:/questions/9389503/how-to-prevent-java-lang-string-split-from-creating-a-leading-empty-string