代码之家  ›  专栏  ›  技术社区  ›  AndreiM

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

  •  5
  • AndreiM  · 技术社区  · 15 年前

    我需要能够用逗号、分号或空格(或三者的混合)来拆分输入字符串。我还希望将输入中的多个连续分隔符视为单个分隔符。以下是我目前为止的情况:

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

    这是有效的,除非输入字符串以一个分隔符字符开头,在这种情况下,结果数组的第一个元素是空字符串。我不希望我的结果有空字符串,这样,“、、、零、、;;一、二、,”之类的东西只返回一个包含大写字符串的三元素数组。

    有没有比在调用string.split之前去掉任何与我的reg ex匹配的前导字符更好的方法?

    事先谢谢!

    4 回复  |  直到 15 年前
        1
  •  3
  •   Mark Byers    15 年前

    如果“更好”的意思是更高的性能,那么您可能需要尝试创建一个符合您想要匹配和使用的内容的正则表达式。 Matcher.find 在一个循环中,找到火柴就拔出来。这样可以先保存修改字符串的操作。但是,您可以自己测量一下,看看哪种数据更快。

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

        2
  •  6
  •   Bart Kiers    15 年前

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

    return input.split(regex, 0);
    

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

    return input.replaceFirst("^"+regex, "").split(regex, 0);
    
        3
  •  2
  •   Julien Silland    15 年前

    几乎所有构建在JDK中的拆分设施都以某种方式被破坏。你最好用第三方课程,比如 Splitter ,在处理空令牌和空白空间方面既灵活又正确:

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

    将生成包含“零”、“一”、“二”的iterable<string>

        4
  •  1
  •   mtruesdell    15 年前

    您还可以使用 StringTokenizer 要构建列表,请根据需要对其进行什么操作:

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

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