相同的正则表达式,但使用 StringTokenizer 和 Scanner class 分隔符给出不同的结果

Same regex but giving different result with StringTokenizer and Scanner class delimiter

我正在尝试使用 StringTokenizer class 来分隔句子中的每个单词。这对我来说可以。但是我使用 Scanner class.I 为我的案例找到了另一种解决方案,在两种方式中都应用了相同的正则表达式,但得到了不同的结果。我想知道我得到不同输出但表达相同的原因。
这是我的代码:

String sentence = "I have some problems with this section!"
        + " But I love to learn.";


StringTokenizer st = new StringTokenizer(sentence, "[! ]");
System.out.println("========Using StringTokenizer=========");
while (st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}


Scanner s = new Scanner(sentence);
s.useDelimiter("[! ]");
System.out.println("========Using Delimiter=========");
while (s.hasNext()) {
    System.out.println(s.next());

}

输出形式 StringTokenizer:

========Using StringTokenizer=========
I
have
some
problems
with
this
section
But
I
love
to
learn.

使用扫描仪输出 class :

========Using Delimiter=========
I
have
some
problems
with
this
section

But
I
love
to
learn.

Scanner 包含空匹配,而 StringTokenizer 不包含。

StringTokenizer 无法正确解析具有有意义索引 columns/fields 的分隔文件,例如 /etc/passwd 或 CSV这是因为它不会 return 所有 columns/fields 而 Scanner 会。

因为Scanner可能匹配空的String,而StringTokonizer则不会。在这种情况下,"section! But" Scanner 匹配 ! 符号后的空格,而 StringTokenizer 不匹配。