Grundlegendes zu useDelimiter in Scanner: Warum erhalte ich ein leeres Token?

Ich verwende einen Scanner mit Trennzeichen und bin auf ein seltsames Verhalten gestoßen, das ich gerne verstehen würde.

Ich benutze dieses Programm:

    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);
    }

Die Ausgabe ist:

Aller
à

Navigation
rechercher

Also verstehe ich zuerst nicht, warum ich ein leeres Zeichen bekomme, dasDokumentation sagt:

Abhängig von der Art des Begrenzungsmusters können leere Token zurückgegeben werden. Das Muster "\ s +" gibt beispielsweise keine leeren Token zurück, da es mit mehreren Instanzen des Begrenzers übereinstimmt. Das Begrenzungsmuster "\ s" könnte leere Token zurückgeben, da es jeweils nur ein Leerzeichen passiert.

Ich benutze\\s+ Warum wird ein leeres Token zurückgegeben?

Dann gibt es noch eine andere Sache, die ich in Bezug auf Regex verstehen möchte. Wenn ich das Trennzeichen mit der "umgekehrten" Regex ändere:

    sc.useDelimiter("\\s*\\p{Punct}+\\s*|\\s+");

Die Ausgabe ist korrekt und ich bekomme:

Aller
à
Navigation
rechercher

Warum funktioniert es so?

EDIT:

In diesem Fall:

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

Ich habe immer noch ein leeres Zeichen dazwischenintroduction undapprox. Kann man das vermeiden?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage