如何防止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)); }