Zrozumienie useDelimiter w skanerze: dlaczego otrzymuję pusty token?
Używam skanera z separatorem i natknąłem się na dziwne zachowanie, które chciałbym zrozumieć.
Używam tego programu:
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);
}
Dane wyjściowe to:
Aller
à
Navigation
rechercher
Więc najpierw nie rozumiem, dlaczego otrzymuję pusty tokendokumentacja mówi :
W zależności od rodzaju wzoru ograniczającego puste znaczniki mogą zostać zwrócone. Na przykład wzorzec „s +” nie zwróci żadnych pustych tokenów, ponieważ pasuje do wielu wystąpień separatora. Wzorzec ograniczający „s” może zwracać puste żetony, ponieważ mija tylko jedno pole na raz.
używam\\s+
dlaczego więc zwraca pusty token?
Jest jeszcze jedna rzecz, którą chciałbym zrozumieć odnośnie regex. Jeśli zmienię separator za pomocą wyrażenia „odwróconego”:
sc.useDelimiter("\\s*\\p{Punct}+\\s*|\\s+");
Wynik jest poprawny i otrzymuję:
Aller
à
Navigation
rechercher
Dlaczego to działa na swój sposób?
EDYTOWAĆ :
W tym przypadku:
Scanner sc = new Scanner("(23 ou 24 minutes pour les épisodes avec introduction) (approx.)1");
sc.useDelimiter("\\s*\\p{Punct}+\\s*|\\s+"); //second regex
Nadal mam pusty żetonintroduction
iapprox
. Czy można tego uniknąć?