【问题标题】:How can split a string which contains only delimiter?如何拆分仅包含分隔符的字符串?
【发布时间】:2009-04-24 12:09:28
【问题描述】:

我正在使用以下代码:

String sample = "::";
String[] splitTime = sample.split(":");
// extra detail omitted
System.out.println("Value 1 :"+splitTime[0]);
System.out.println("Value 2 :"+splitTime[1]);
System.out.println("Value 3 :"+splitTime[2]);

我收到ArrayIndexOutofBound 异常。 String.split() 如何处理连续或尾随/打开的分隔符?

另见

【问题讨论】:

    标签: java regex split


    【解决方案1】:

    Alnitak 是正确的,默认情况下会丢弃尾随的空字符串。

    如果您想要尾随空字符串,您应该使用split(String, int) 并传递一个负数作为limit 参数。

    limit 参数控制 模式被应用,因此会影响结果的长度 大批。如果限制 n 大于零,则模式 最多会应用 n - 1 次,数组的 长度将不大于 n,并且数组的最后一个条目 将包含最后一个匹配分隔符之外的所有输入。如果 n 是非正数,则该模式将被应用多次 可能,并且数组可以有任何长度。如果 n 为零,则 该模式将被应用尽可能多的次数,该数组可以 长度不限,尾随的空字符串将被丢弃。

    注意split(aString)split(aString, 0) 的同义词:

    此方法的工作方式就像通过使用给定表达式和零限制参数调用两个参数 split 方法一样。因此,尾随的空字符串不包含在结果数组中。

    此外,您应该使用循环从数组中获取值;这避免了可能的ArrayIndexOutOfBoundsException

    所以你更正的代码应该是(假设你想要尾随的空字符串):

    String sample = "::";
    String[] splitTime = sample.split(":", -1);
    for (int i = 0; i < splitTime.length; i++) {
        System.out.println("Value " + i + " : \"" + splitTime[i] + "\"");
    }
    

    输出:

    值 0:“” 值 1:“” 值 2:“”

    【讨论】:

    • 关于 -ve 限制的优点,但仍然需要检查数组边界,以防输入中只有一个“:”。
    【解决方案2】:

    来自J2SE API manual

    因此,结果数组中不包含尾随的空字符串。

    因此,如果您传入“::”,您将得到一个空数组,因为所有分隔符都在尾随。

    如果您想确保获得不超过三个条目,您应该使用:

    String[] splitTime = sample.split(":", 3);
    

    输入“::”确实会在输出数组中为您提供三个空字符串。

    但是,如果输入恰好有一个“:”,那么您仍然只能在数组中获得两个元素。

    【讨论】:

    • 使用 "::".split(":") 实际上返回一个空数组而不是一个二元数组。
    【解决方案3】:

    也许像这样?

    int ndx = 0;
    StringTokenizer t = new StringTokenizer(": : ::::",":");
    while (t.hasMoreElements())
    {
        System.out.println(String.format("Value %d : %s", ++ndx,t.nextElement()));
    }
    

    【讨论】:

    • 返回两个标记,每个标记只包含一个空格。但 Raja 专门询问了只包含分隔符的字符串
    • 还有几点。 1. 当你使用 StringTokenizer 时,你应该总是使用 hasMoreTokens() 和 nextToken(),而不是 hasMoreElements() 和 nextElement()。这些只是为了充实 Enumeration 接口。 2.不需要像以前那样使用String.format();像 System.out 这样的 PrintStreams 有自己的 format() 方法,加上传统主义者的 printf() 方法。 :-)
    • 谢谢 Alan,您可能已经猜到了,java 不是我的主要语言。但是,我正在努力变得更加熟练。所以我很感激你的cmets。
    • FWIW,不推荐使用 StringTokenizer。
    【解决方案4】:

    您应该检查 splitTime 数组的长度。

    【讨论】:

      【解决方案5】:

      使用函数 StringTokenizer 传递字符串和第二个参数作为分隔符

      使用 splittime.length 函数求长度

      【讨论】:

      • 不好的建议。 StringTokenizer 会将两个冒号视为一个分隔符。无论如何,StringTokenizer 是一个遗留类;鼓励开发人员改用 split()。
      • 关于使用 splitTime.length:在此示例中,长度始终为零。所有的“令牌”都是长度为零的字符串,并且 StringTokenizer 永远不会返回空令牌。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      相关资源
      最近更新 更多