当我运行以下代码时,我发现了一些奇怪的东西。
以下程序的输出是token1=AAAAA token2=BBBBB|
但是,根据我的理解,它应该是token1=AAAAA token2=BBBBB|虚拟
public class TestToken {
public static void main(final String[] args) {
final String delim = "DELIM";
String token1 = "AAAAA";
String token2 = "BBBBB|DUMMY";
final String input = token1 + delim + token2;
final StringTokenizer tokenizer = new StringTokenizer(input, delim);
final String text1 = tokenizer.nextToken();
final String text2 = tokenizer.nextToken();
System.out.println("token1=" + text1);
System.out.println("token2=" + text2);
System.out.println();
}
}
有人可以解释我如何解决这个问题以及为什么它的行为是这样的吗?
构造函数文档摘录:
delim 参数中的字符是分隔标记的分隔符。
这意味着每个字符都是一个分隔符,而不是整个字符串。实际上,您有 5 个分隔符(字符D
、E
、L
、I
和M
(。
您可以使用以下代码查看效果
while (tokenizer.hasMoreTokens())
System.out.println(tokenizer.nextToken());
其中打印出来:
AAAAA
BBBBB|
U
Y
否 您的分隔符是 D E L I 和 M
查看 javadocsdelim 参数中的所有字符都是用于分隔标记的分隔符。
Delim - 分隔符。
考虑
final String delim = "DELIM";
String token1 = "AAAAA";
String token2 = "BBBBB|ZUMMY";
final String input = token1 + delim + token2;
final StringTokenizer tokenizer = new StringTokenizer(input, delim);
final String text1 = tokenizer.nextToken();
final String text2 = tokenizer.nextToken();
System.out.println("token1=" + text1);
System.out.println("token2=" + text2);
System.out.println();
StringTokenizer
采用一个字符串,其中每个字符都是一个分隔符。由于D
是您的分隔符之一,因此第二个令牌在|
之后被切断。
如果要使用多字符分隔符,则必须使用其他技术。 例如,split
:
String[] parts = Arrays.toString(input.split(delim));
有多个选项可以实现此功能。首先要说为什么会发生这种情况,我认为各种帖子都很好地解释了这是因为您的分量表不是"DELIM",而是"D","E","L","I","M">
现在,如果您想基于另一个字符串(如 DELIM(分隔字符串,您可以使用什么
选项 1:使用字符串拆分方法,该方法将 delimeter 字符串作为参数并返回标记数组
String statement = "AAAADELIMBBBB|DUMMY";
String tokens[] = statement.split("DELIM");
选项 2:使用 splitAsStream,它将语句作为参数,编译将正则表达式分隔符作为参数
Pattern.compile("DELIM").splitAsStream("AAAADELIMBBBB|DUMMY").forEach(System.out::println);
选项 3:使用 Stream.of 和拆分作为参数
Stream.of("AAAADELIMBBBB|DUMMY".split("DELIM")).forEach(System.out::println);
除了上述超酷的拆分方式之外,如果您是字符串分词器的铁杆粉丝并且只想使用它来实现它,您还可以使用带有"D"的字符串分词器作为分量仪,然后对于收到的每个令牌,可以检查前四个字符是否为"ELIM"。如果是,则将 remaninng 子字符串作为令牌并与进一步的接收令牌连接,如果没有,则在 start 中附加 D,然后附加当前令牌。
来自 StringTokenizer 的文档
为指定的字符串构造字符串分词器。delim 参数中的字符是分隔标记的分隔符。分隔符本身不会被视为标记。
这意味着DELIM
不是分隔符,而是其中的所有字符都是分隔符(即D
、E
、L
、I
和M
(。
运行以下代码时:
public static void main(final String[] args) {
final String delim = "DELIM";
String token1 = "AAAAA";
String token2 = "BBBBB|DUMMY";
final String input = token1 + delim + token2;
final StringTokenizer tokenizer = new StringTokenizer(input, delim);
while(tokenizer.hasMoreElements()){
System.out.println("token =" + tokenizer.nextToken());
}
}
它给出以下输出:
token =AAAAA
token =BBBBB|
token =U
token =Y
如您所见,您的输入在D
&M
上被拆分(存在于您的输入中(。
正如文档所解释的,delim 参数中的所有字符都是分隔标记的分隔符。
您需要做的是使用拆分功能。
public static void main(final String[] args) {
final String delim = "DELIM";
String token1 = "AAAAA";
String token2 = "BBBBB|DUMMY";
final String input = token1 + delim + token2;
final String[] tokens = input.split("DELIM");
for (String token:tokens) {
System.out.println(token);
}
}