对包含空标记的String进行标记

Ada*_*ski 7 java string string-split stringtokenizer java.util.scanner

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

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

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

我已经尝试使用String.split,Scanner并且StringTokenizer对于这一点,但每个给出不同的不希望的输出(下文实施例).有人可以建议一个优雅的解决方案,最好使用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());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

产量

$ 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
Run Code Online (Sandbox Code Playgroud)

pb2*_*b2q 18

传递-1split作为limit参数:

String s = ",abd,def,,ghi,";
String[] tokens = s.split(",", -1);
Run Code Online (Sandbox Code Playgroud)

然后你的结果数组将包含任何尾随空字符串.

来自javadocs:

如果[限制]是非正数,那么模式将被应用尽可能多次,并且数组可以具有任何长度.如果[limit]为零,那么模式将被应用尽可能多次,数组可以具有任何长度,并且尾随空字符串将被丢弃.

调用split(regex)就像limit参数一样0,因此丢弃尾随空字符串.