【问题标题】:Tokenising a String containing empty tokens对包含空标记的字符串进行标记
【发布时间】:2012-09-05 22:15:04
【问题描述】:

我有一个看似简单的问题,将逗号分隔的String 拆分为标记,在以下情况下输出应包含空标记:

  • String 中的第一个字符是逗号。
  • String 中的最后一个字符是逗号。
  • 出现两个连续的逗号。

例如,对于String",abd,def,,ghi," 应该产生输出:{"", "abd", "def", "", "ghi", ""}

我已经尝试使用 String.splitScannerStringTokenizer 来解决这个问题,但每个都给出了不同的不想要的输出(下面的示例)。谁能为此提出一个优雅的解决方案,最好使用 JDK 类?显然我可以自己编写一些代码,但我觉得我在提到的三种方法之一上遗漏了一些东西。请注意,分隔符是固定的String,但不一定是逗号,也不是单个字符。

示例代码

import java.util.*;

public class Main12 {
  public static void main(String[] args) {
    String s = ",abd,def,,ghi,";
    String[] tokens = s.split(",");

    System.err.println("--- String.split Output ---");
    System.err.println(String.format("%s -> %s", s, Arrays.asList(tokens)));

    for (int i=0; i<tokens.length; ++i) {
      System.err.println(String.format("tokens[%d] = %s", i, tokens[i]));
    }

    System.err.println("--- Scanner Output ---");

    Scanner sc = new Scanner(s);
    sc.useDelimiter(",");
    while (sc.hasNext()) {
      System.err.println(sc.next());
    }

    System.err.println("--- StringTokenizer Output ---");

    StringTokenizer tok = new StringTokenizer(s, ",");
    while (tok.hasMoreTokens()) {
      System.err.println(tok.nextToken());
    }
  }
}

输出

$ java Main12
--- String.split Output ---
,abd,def,,ghi, -> [, abd, def, , ghi]
tokens[0] =
tokens[1] = abd
tokens[2] = def
tokens[3] =
tokens[4] = ghi
--- Scanner Output ---
abd
def

ghi
--- StringTokenizer Output ---
abd
def
ghi

【问题讨论】:

    标签: java string java.util.scanner stringtokenizer string-split


    【解决方案1】:

    -1 传递给split 作为limit 参数:

    String s = ",abd,def,,ghi,";
    String[] tokens = s.split(",", -1);
    

    那么您的结果数组将包含任何尾随的空字符串。

    来自javadocs

    如果 [the limit] 为非正数,则该模式将被应用尽可能多的次数,并且数组可以具有任意长度。如果 [the limit] 为零,则该模式将被应用尽可能多的次数,数组可以具有任意长度,并且尾随的空字符串将被丢弃。

    调用split(regex) 的行为就像limit 参数是0,所以尾随的空字符串被丢弃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-01
      • 2015-10-22
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      相关资源
      最近更新 更多