Java 理解扫描仪中的useDelimiter:为什么我得到空白令牌?

Java 理解扫描仪中的useDelimiter:为什么我得到空白令牌?,java,parsing,Java,Parsing,我正在使用带分隔符的扫描器,我遇到了一个我想理解的奇怪行为 我正在使用这个程序: Scanner sc = new Scanner("Aller à : Navigation, rechercher"); sc.useDelimiter("\\s+|\\s*\\p{Punct}+\\s*"); String word=""; while(sc.hasNext()){ word = sc.next(); System.out.prin

我正在使用带分隔符的扫描器,我遇到了一个我想理解的奇怪行为

我正在使用这个程序:

    Scanner sc = new Scanner("Aller à : Navigation, rechercher");
    sc.useDelimiter("\\s+|\\s*\\p{Punct}+\\s*");
    String word="";
    while(sc.hasNext()){
        word = sc.next();
        System.out.println(word);
    }
输出为:

Aller
à

Navigation
rechercher
所以首先我不明白为什么我会得到一个空白代币,上面写着:

根据定界模式的类型,可能会返回空令牌。例如,模式“\s+”将不返回空标记,因为它匹配分隔符的多个实例。定界模式“\s”可能返回空令牌,因为它一次只通过一个空间

我使用的是
\\s+
,为什么它会返回一个空白令牌

还有一件事我想了解关于regex的。如果使用“reversed”正则表达式更改分隔符:

输出是正确的,我得到:

Aller
à
Navigation
rechercher
为什么它会起作用?

编辑:

在这种情况下:

    Scanner sc = new Scanner("(23 ou 24 minutes pour les épisodes avec introduction) (approx.)1");
    sc.useDelimiter("\\s*\\p{Punct}+\\s*|\\s+"); //second regex

我在
简介
大约
之间仍然有一个空白标记。有可能避免吗?

我有一种感觉,您在有空格和标点符号的地方造成了两个分隔符捕获。为什么不直接使用
[\\s\\p{Punct}]+


此正则表达式
\\s+|\\p{Punct}+
将首先捕获空空格并将其吞掉,然后捕获下一个分隔符作为标点。这将是两个相邻的分隔符,中间没有任何内容(空标记)。

我碰巧在Scanner类中也遇到了空标记问题。我认为分隔符模式必须通过用括号括起来并在组中附加+来创建。我用的图案是这样的

"((\\s)+|(\\\\r\\\\n)+|\\p{Punct}+)+". 

我有一种感觉,你是造成两个分隔符捕获的地方有一个空格后面的标点符号。为什么不直接使用
“[\\s\\p{Punct}]+”
?还是我过分简化了问题?@HovercraftFullOfEels谢谢你的正则表达式非常适合我的需要!我以为
\\s+\\\p{Punct}+
(我从这个开始,没有提到)和你的一样,但这不是为什么?我还在寻找
\\s*\\p{Punct}+\\s*\\\\s+
\\s+\\\s*\\p{Punct}之间区别的解释+\\s*
非常感谢,因此在我的示例中,如果第二个模式有效,那是因为
\\s*\\p{Punct}+\\s*
已经捕获了`:`那么
\\s+
就不使用了,也没有空白。我说得对吗?
"((\\s)+|(\\\\r\\\\n)+|\\p{Punct}+)+".