2010-03-05 7 views
8

Ceci est probablement un quicky. Pourquoi ce code ne renvoie rien?Java: chaîne de balayage pour un motif

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

Répondre

15

hasNext(String pattern) renvoie uniquement true si le jeton suivant correspond au modèle. Dans votre cas, "asda" est le jeton suivant, et cela ne correspond PAS "[A-Z]+". La documentation est claire en ce sens que "le scanner ne dépasse aucune entrée".

Si vous modifiez le motif en "[A-Za-z]+", vous obtiendrez trois jetons, ce qui correspond peut-être à vos attentes.

Si, en fait, vous voulez seulement obtenir des jetons qui correspondent "[A-Z]+", alors vous pouvez faire une des opérations suivantes:

  • simplement jeter des jetons qui ne correspondent pas
  • useDelimiter("[^A-Z]+"), puis appelez simplement next()
  • utiliser skip("[^A-Z]+")
  • utilisation findInLine("[A-Z]+")

Astuce: si les performances sont critiques, vous devez utiliser les surcharges préchargées Pattern de ces méthodes. Astuce: gardez à l'esprit que "Xooo ABC" a deux correspondances "[A-Z]+". Si ce n'est pas ce que vous voulez, alors l'expression rationnelle devra être un peu plus compliquée. Ou vous pouvez toujours supprimer les jetons non correspondants.

0

changement

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

à

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

Si vous êtes à la recherche d'imprimer tous les mots entourés par votre delimiter vous pouvez être sûr et exclure le modèle tout à fait. De cette façon, vous ne rencontrez pas un mot contenant un caractère qui ne figure pas dans votre modèle, ce qui provoquerait la sortie de votre programme de cette boucle (comme c'est le cas actuellement). Par exemple:

while ((sc.hasNext())) { 

     System.out.println(sc.next()); 
    } 
Questions connexes