我需要能够用逗号,分号或空格(或三者的混合)来分割输入字符串。我还想将输入中的多个连续分隔符视为单个分隔符。这是我到目前为止所做的:
String regex = "[,;\\s]+";
return input.split(regex);
除了输入字符串以其中一个分隔符开头之外,这是有效的,在这种情况下,结果数组的第一个元素是一个空字符串。我不希望我的结果有空字符串,所以像“,,,, ZERO;,;; ONE,TWO;”这样的东西只返回一个包含大写字符串的三元素数组。
有没有更好的方法来执行此操作,而不是在调用String.split之前删除与我的reg-ex匹配的任何前导字符?
提前致谢!
答案 0 :(得分:6)
不,没有。您只能通过将0作为String的split()方法的第二个参数来忽略尾随分隔符:
return input.split(regex, 0);
但是对于领先的分隔符,你必须先剥离它们:
return input.replaceFirst("^"+regex, "").split(regex, 0);
答案 1 :(得分:3)
如果“更好”意味着更高的性能,那么您可能希望尝试创建一个匹配您想要匹配的正则表达式,并在循环中使用Matcher.find
并在找到它们时拉出匹配项。这样可以节省首先修改字符串。但要自己测量一下,看看哪种数据更快。
如果“更好”意味着更简单,那么我不认为有比您建议的方式更简单的方法:在应用拆分之前删除前导分隔符。
答案 2 :(得分:2)
几乎所有内置于JDK中的拆分工具都以这种或那种方式被破坏。你最好使用第三方类,例如Splitter,它在处理空标记和空格方面既灵活又正确:
Splitter.on(CharMatcher.anyOf(";,").or(CharMatcher.WHITESPACE))
.omitEmptyStrings()
.split(",,,ZERO;,ONE TWO");
将产生一个Iterable< String>包含“ZERO”,“ONE”,“TWO”
答案 3 :(得分:1)
您还可以使用StringTokenizer来构建列表,具体取决于您需要使用它:
StringTokenizer st = new StringTokenizer(",,,ZERO;,ONE TWO", ",; ", false);
while(st.hasMoreTokens()) {
String str = st.nextToken();
//add to list, process, etc...
}
但是,作为一个警告,您需要在构造函数的第二个参数中分别定义每个潜在的空白字符。