Entendiendo useDelimiter in Scanner: ¿por qué obtengo el token en blanco?
Estoy usando un escáner con delimitador y me he encontrado con un comportamiento extraño que me gustaría entender.
Estoy usando este programa:
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);
}
La salida es:
Aller
à
Navigation
rechercher
Así que primero no entiendo por qué recibo una ficha en blanco, eldocumentación dice :
Dependiendo del tipo de patrón de delimitación, se pueden devolver los tokens vacíos. Por ejemplo, el patrón "\ s +" no devolverá tokens vacíos ya que coincide con varias instancias del delimitador. El patrón de delimitación "\ s" podría devolver tokens vacíos, ya que solo pasa un espacio a la vez.
Estoy usando\\s+
Entonces, ¿por qué devuelve un token en blanco?
Luego hay otra cosa que me gustaría entender con respecto a las expresiones regulares. Si cambio el delimitador usando la expresión regular "invertida":
sc.useDelimiter("\\s*\\p{Punct}+\\s*|\\s+");
La salida es correcta y me sale:
Aller
à
Navigation
rechercher
¿Por qué funciona en el camino?
EDITAR:
Con este caso:
Scanner sc = new Scanner("(23 ou 24 minutes pour les épisodes avec introduction) (approx.)1");
sc.useDelimiter("\\s*\\p{Punct}+\\s*|\\s+"); //second regex
Todavía tengo una ficha en blanco entreintroduction
yapprox
. ¿Es posible evitarlo?