【问题标题】:String.split() - matching leading empty String prior to first delimiter?String.split() - 在第一个分隔符之前匹配前导空字符串?
【发布时间】:2010-04-28 19:16:24
【问题描述】:

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

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

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

有没有比在调用 String.split 之前去除与我的正则表达式匹配的任何前导字符更好的方法?

提前致谢!

【问题讨论】:

  • 不作为答案发布,因为我不记得 Java 正则表达式 API,但您可以简单地搜索非定界符字符串,而不是在定界符上拆分,例如使用像 [^,;\s]+ 这样的正则表达式。
  • 显然相同的问题,更新但更好接受的答案:stackoverflow.com/questions/9389503/…

标签: java regex


【解决方案1】:

不,没有。您只能通过将 0 作为第二个参数提供给 String 的 split() 方法来忽略尾随分隔符:

return input.split(regex, 0);

但对于前导分隔符,您必须先去除它们:

return input.replaceFirst("^"+regex, "").split(regex, 0);

【讨论】:

  • 负参数? If n is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded.来自java.sun.com/javase/6/docs/api/java/lang/…
  • 哎呀,是的,我的意思是 0。谢谢!
【解决方案2】:

如果“更好”意味着更高的性能,那么您可能想尝试创建一个与您想要匹配的内容匹配的正则表达式,并在循环中使用Matcher.find 并在找到匹配项时提取它们。这样可以先保存修改字符串。但是请自己测量一下,看看哪个对您的数据更快。

如果“更好”的意思是更简单,那么不,我认为没有比您建议的方式更简单的方法:在应用拆分之前删除前导分隔符。

【讨论】:

    【解决方案3】:

    几乎所有内置于 JDK 中的拆分工具都以某种方式被破坏了。最好使用Splitter 等第三方类,它在处理空标记和空格方面既灵活又正确:

    Splitter.on(CharMatcher.anyOf(";,").or(CharMatcher.WHITESPACE))
        .omitEmptyStrings()
        .split(",,,ZERO;,ONE TWO");
    

    将产生一个包含“ZERO”、“ONE”、“TWO”的 Iterable

    【讨论】:

      【解决方案4】:

      您还可以使用StringTokenizer 来构建列表,具体取决于您需要使用它做什么:

      StringTokenizer st = new StringTokenizer(",,,ZERO;,ONE TWO", ",; ", false);
      while(st.hasMoreTokens()) {
        String str = st.nextToken();
        //add to list, process, etc...
      }
      

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

      【讨论】:

        猜你喜欢
        • 2012-02-06
        • 2016-10-28
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2014-05-09
        • 1970-01-01
        • 1970-01-01
        • 2019-06-11
        相关资源
        最近更新 更多