我有一个带分隔符的字符串 (~
)
String str="ABC~DEF~GHI~JKL~~MNO";// Input String
while(stk.hasMoreTokens()){
obj[i]=stk.nextToken();
i++;
}
for(Object ob:obj){
System.out.print(ob+"~>");
}
我正在使用 StringTokenizer 将字符串分解为 token ,但是每当连续分隔符
出现在中间且没有任何空格
时,StringTokenizer
就会跳过它并采取下一个 token
实际输出
ABC~>DEF~>GHI~>JKL~>MNO~>null~>
期望的输出
ABC~>DEF~>GHI~>JKL~>null~>MNO~> // Don't want to skip consecutive tokens
为什么会发生这种情况?
注意:
我知道我可以使用String#split(String delimeter)
方法获得所需的输出,但是,我想知道出现奇怪行为的根本原因。
这里也提出了同样的问题(String Tokenizer issue),但没有提供原因,只有替代解决方案
最佳答案
我假设您使用了new StringTokenizer(str,"~")
StringTokenizer 使用 token 的定义:token 是分隔符之间的最大非空字符序列。
由于 ~~
之间的字符串为空,因此它不能是 token (根据此定义)。
我使用以下代码来验证:
public static void main(String[] args) {
List<Object> obj = new ArrayList<>();
String str = "ABC~DEF~GHI~JKL~~MNO";// Input String
StringTokenizer stk = new StringTokenizer(str,"~");
while (stk.hasMoreTokens()) {
obj.add(stk.nextToken());
}
for (Object ob : obj) {
System.out.print(ob + "~>");
}
}
实际输出(与token定义一致)
ABC~>DEF~>GHI~>JKL~>MNO~>
如果问题是:为什么要这样定义 token ?看这个例子:
String str = "ABC DEF GHI"; // two spaces between
Stringtokenizer 找到 3 个 token 。如果您不强制 token 为非空,则将返回 5 个 token (2 个为“”)。如果您编写一个简单的解析器,则当前的行为更可取。
关于java - 字符串标记器的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28848143/