2010-03-05 23 views
8

Esta es probablemente una QUICKY. ¿Por qué este código no devuelve nada?Java: cadena de escaneo para un patrón

import java.util.Scanner; 

public class MainClass { 

public static void main(String[] args) { 
    try { 

     Scanner sc = new Scanner("asda ASA adad"); 
     String pattern = "[A-Z]+"; 

     while ((sc.hasNext(pattern))) { 

      System.out.println(sc.next(pattern)); 
     } 
     sc.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

Respuesta

15

hasNext(String pattern) sólo se devuelve true si el siguiente token coincide con el patrón. En su caso, "asda" es el siguiente token, y que no coincide con "[A-Z]+". La documentación es clara en que "[el] escáner no avanza más allá de cualquier entrada".

Si cambia el patrón de "[A-Za-z]+", entonces se obtendría tres fichas, que pueden ser lo que pretende.

Si, de hecho, sólo desea obtener fichas que coinciden "[A-Z]+", a continuación, puede realizar cualquiera de los siguientes:

  • simplemente descartar fichas no coincidentes
  • useDelimiter("[^A-Z]+"), entonces simplemente invocar next()
  • utilizar skip("[^A-Z]+")
  • uso findInLine("[A-Z]+")

Consejo: si el rendimiento es crítico, que te gustaría utilizar los precompilados Pattern sobrecargas de estos métodos.

Consejo: tenga en cuenta que "Xooo ABC" tiene dos "[A-Z]+" coincidencias. Si esto no es lo que quieres, entonces la expresión regular tendrá que ser un poco más complicada. O siempre puedes descartar los tokens que no coinciden.

0

Cambio

String pattern = "[A-Z]+"; 

a

String pattern = "[a-zA-Z]+"; 
0

Si usted está buscando para imprimir todas las palabras rodeadas por el delimitador es posible que desee ser seguro y excluir el patrón completo. De esa manera usted no viene a través de una palabra que contiene un carácter no en su patrón de lo que causaría su salida del programa ese bucle (como se está haciendo actualmente). Por ejemplo:

while ((sc.hasNext())) { 

     System.out.println(sc.next()); 
    } 
Cuestiones relacionadas