将包含空标记的字符串进行标记化

10

我有一个看起来很简单的问题:将逗号分隔的字符串拆分为标记,输出应包含空标记,如果出现以下情况:

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

例如,对于字符串:",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
1个回答

26

-1作为splitlimit参数传递:

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

如果您使用了split(regex,limit)方法,并且limit参数为零,那么在结果数组中将不包含结尾的空字符串。从Java文档中可以得到以下信息:

如果[限制]非正数,则将尽可能多地应用模式,并且数组的长度可以为任意值。如果[限制]为零,则将尽可能多地应用模式,数组可以为任意长度,并且舍弃结尾的空字符串。

调用split(regex)方法时,就好像limit参数是0一样,因此会舍弃结尾的空字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接