字符串标记器显示不需要的结果



当我运行以下代码时,我发现了一些奇怪的东西。

以下程序的输出是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 个分隔符(字符DELIM(。

您可以使用以下代码查看效果

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不是分隔符,而是其中的所有字符都是分隔符(即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 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);
}
}

相关内容

  • 没有找到相关文章

最新更新