Java: la numérisation de la chaîne pour un motif
C'est probablement un quicky. Pourquoi ce code ne retourne rien?
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();
}
}
}
OriginalL'auteur Markos Fragkakis | 2010-03-05
Vous devez vous connecter pour publier un commentaire.
hasNext(String pattern)
ne renvoietrue
si le prochain jeton correspond au modèle. Dans votre cas,"asda"
est le prochain jeton, et qui ne correspond PAS à"[A-Z]+"
. La documentation est claire que "[la] scanner ne pas avancer au-delà de l'entrée".Si vous modifiez le modèle de
"[A-Za-z]+"
, puis vous obtenez trois jetons, ce qui peut être ce que vous souhaitiez.En fait, si vous voulez seulement obtenir des jetons qui correspondent à
"[A-Z]+"
, alors vous pouvez faire un des éléments suivants:useDelimiter("[^A-Z]+")
, puis il suffit d'invoquernext()
skip("[^A-Z]+")
findInLine("[A-Z]+")
Astuce: si la performance est critique, vous voulez les utiliser précompilé
Pattern
surcharges de ces méthodes.Astuce: ne gardez à l'esprit que
"Xooo ABC"
a deux"[A-Z]+"
matchs. Si ce n'est pas ce que vous voulez, puis la regex va falloir être un peu plus compliqué. Ou vous pouvez toujours jetez simplement non-correspondance des jetons.OriginalL'auteur polygenelubricants
Changer
à
OriginalL'auteur Chris B.
Si vous êtes à la recherche d'imprimer tous les mots entouré par votre délimiteur vous pourriez être en sécurité et d'exclure le modèle tout à fait. De cette façon, vous ne venez pas à travers un mot qui contient un caractère qui n'est pas dans votre profil qui serait la cause de votre programme de sortie de cette boucle (comme c'est actuellement en train de faire). Par exemple:
OriginalL'auteur Dark Castle