java - 字符串标记器的奇怪行为

标签 java stringtokenizer

我有一个带分隔符的字符串 (~)

    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/

相关文章:

java - 恢复上一个 Activity 并完成上一个 Activity

java - 每次除法我得到 0.0

java - 如何使 RecyclerView 不可点击并将 onClick 事件传递给父 View ?

java - 执行 SSL TLS 客户端服务器 Java 程序时出现问题

java - 使用迭代时超出 Clojure GC 开销限制

Java string.split( ) 在逗号或行尾

java - 程序中的 StringTokenizer 与 split()

Java stringtokenizer 赋值问题

java - 使用 StringTokenizer 获取单词

java计算器没有堆栈或数组列表