String.split() - 在第一个分隔符之前匹配前导空字符串?

时间:2010-04-28 19:16:24

标签: java regex

我需要能够用逗号,分号或空格(或三者的混合)来分割输入字符串。我还想将输入中的多个连续分隔符视为单个分隔符。这是我到目前为止所做的:

String regex = "[,;\\s]+";    
return input.split(regex);

除了输入字符串以其中一个分隔符开头之外,这是有效的,在这种情况下,结果数组的第一个元素是一个空字符串。我不希望我的结果有空字符串,所以像“,,,, ZERO;,;; ONE,TWO;”这样的东西只返回一个包含大写字符串的三元素数组。

有没有更好的方法来执行此操作,而不是在调用String.split之前删除与我的reg-ex匹配的任何前导字符?

提前致谢!

4 个答案:

答案 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...
}

但是,作为一个警告,您需要在构造函数的第二个参数中分别定义每个潜在的空白字符。