Tokenising含有空令牌的字符串(Tokenising a String containing

2019-06-28 07:20发布

我有分裂以逗号分隔的一个看似简单的问题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

Answer 1:

传递-1splitlimit参数:

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

然后你的结果阵列将包括任何尾随空字符串。

从的javadoc :

如果[极限]非正则模式将被应用多次可能的,并且阵列可以具有任意长度。 如果[极限]是零,那么图案将被应用的次数成为可能,该阵列可具有任何长度,和后空字符串将被丢弃。

调用split(regex)充当如果limit参数是0 ,所以拖尾空字符串被丢弃。



文章来源: Tokenising a String containing empty tokens