[英]StringTokenizer showing unwanted results
当我运行以下代码时,我发现了一些奇怪的东西。
下面程序的输出是token1 = AAAAA token2 = BBBBB |
但是,据我了解,应该是token1 = AAAAA token2 = BBBBB | DUMMY
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
没有分隔符是DELI和M
请参见javadocs。delim 参数中的所有字符都是用于分隔标记的定界符。
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:使用字符串拆分方法,该方法将以分隔符字符串作为参数并返回令牌数组
String statement = "AAAADELIMBBBB|DUMMY";
String tokens[] = statement.split("DELIM");
选项2:使用splitAsStream(它将语句作为参数并进行编译)将正则表达式定界符作为参数
Pattern.compile("DELIM").splitAsStream("AAAADELIMBBBB|DUMMY").forEach(System.out::println);
选项3 :将Stream.of与split作为争论
Stream.of("AAAADELIMBBBB|DUMMY".split("DELIM")).forEach(System.out::println);
除了上述超级酷的拆分方法外,如果您是String Tokenizer的忠实粉丝,并且只想使用该方法来实现它,则还可以使用String Tokenizer并以“ D”作为分隔符,然后针对收到的每个令牌进行检查前四个字符为“ ELIM”。 如果是,则将remaninng子字符串作为令牌,并与其他接收令牌连接;如果不是,则在开始处附加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参数中的所有字符都是用于分隔标记的定界符。
您需要做的是使用split函数。
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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.