如何防止java.lang.String.split()创build一个前导空string?

传递0作为一个限制参数可以防止尾随的空string,但是如何防止引导空string呢?

例如

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

产生一个带有“”,“Test”,“Stuff”的数组。

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

“StringTokenizer是一个遗留的类,为了兼容性的原因被保留下来,尽pipe在新的代码中它的使用是不鼓励的。build议任何寻求这个function的人使用拆分”

你最好的select可能只是去掉任何分隔符:

 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", "/"); 

Apache Commons有一个实用的方法: org.apache.commons.lang.StringUtils.split

StringUtils.split()

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

我不认为有一种方法可以通过内置的split方法来实现。 所以你有两个select:

1)做你自己的分裂

2)调用拆分和删除空的元素之后遍历数组

如果你自己拆分,你可以结合这两个选项

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

我认为没有内置函数来删除Java中的空白string。 您可以消除空白删除string,但可能会导致错误。 为了安全起见,您可以通过编写一小段代码来做到这一点:

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

你可以使用StringTokenizer来达到这个目的…

 String test1 = "/Test/Stuff"; StringTokenizer st = new StringTokenizer(test1,"/"); while(st.hasMoreTokens()) System.out.println(st.nextToken()); 

我认为你将不得不手动删除第一个空string。 一个简单的方法是这样的 –

  String string, subString; int index; String[] test; string = "/Test/Stuff"; index = string.indexOf("/"); subString = string.substring(index+1); test = subString.split("/"); 

这将排除前导的空string。

这是我解决这个问题的方法。 我把这个string,调用.toCharArray()分裂成一个字符数组,然后循环通过该数组,并将其添加到我的string列表(包装每个stringString.valueOf)。 我想有一些性能折衷,但它似乎是一个可读的解决scheme。 希望这可以帮助!

  char[] stringChars = string.toCharArray(); List<String> stringList = new ArrayList<>(); for (char stringChar : stringChars) { stringList.add(String.valueOf(stringChar)); }