我有一个看似简单的问题,就是将逗号分隔的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());
}
}
}
输出
$ 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
答案 0 :(得分:16)
将-1
传递给split
作为limit
参数:
String s = ",abd,def,,ghi,";
String[] tokens = s.split(",", -1);
然后你的结果数组将包含任何尾随的空字符串。
来自javadocs:
如果[限制]是非正数,那么模式将被应用尽可能多次,并且数组可以具有任何长度。如果[limit]为零,那么模式将被应用尽可能多次,数组可以具有任何长度,并且尾随空字符串将被丢弃。
调用split(regex)
就像limit
参数是0
一样,因此尾随空字符串将被丢弃。