J'ai ce petit bout de code
String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
if(s.matches("[a-z]"))
{
System.out.println(s);
}
}
Censé imprimer
dkoe
mais ça n'imprime rien !!
Bienvenue dans la méthode nommée .matches()
de Java ... Elle essaye et correspond à TOUTES les entrées. Malheureusement, d'autres langues ont emboîté le pas :(
Si vous voulez voir si l'expression rationnelle correspond à un texte d'entrée, utilisez une méthode Pattern
, une Matcher
et la méthode .find()
du matcher:
Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher(inputstring);
if (m.find())
// match
Si vous voulez vraiment savoir si une entrée ne contient que des lettres minuscules, vous pouvez utiliser .matches()
, mais vous devez faire correspondre un ou plusieurs caractères: ajoutez un +
à votre classe de caractères, comme dans [a-z]+
. Ou utilisez ^[a-z]+$
et .find()
.
[a-z]
fait correspondre un single char entre a et z. Ainsi, si votre chaîne était simplement "d"
, par exemple, elle aurait correspondu et aurait été imprimée.
Vous devez modifier votre expression rationnelle en [a-z]+
pour qu'elle corresponde à un ou plusieurs caractères.
L'implémentation Java de regexes essaye de faire correspondre la chaîne entière
qui est différent des expressions rationnelles Perl, qui essaient de trouver une partie correspondante
si vous voulez trouver une chaîne ne contenant que des minuscules, utilisez le modèle [a-z]+
si vous voulez trouver une chaîne contenant au moins un caractère minuscule, utilisez le modèle .*[a-z].*
String.matches
indique si le caractère entier correspond à la regex, pas à n'importe quelle sous-chaîne.
Utilisé
String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
if(s.matches("[a-z]+"))
{
System.out.println(s);
}
}
J'ai fait face au même problème une fois:
Pattern ptr = Pattern.compile("^[a-zA-Z][\\']?[a-zA-Z\\s]+$");
Ce qui précède a échoué!
Pattern ptr = Pattern.compile("(^[a-zA-Z][\\']?[a-zA-Z\\s]+$)");
Ce qui précède a fonctionné avec un modèle dans (
et )
.
Votre expression régulière [a-z]
ne correspond pas à dkoe
car elle correspond uniquement aux chaînes de longueur 1. Utilisez quelque chose comme [a-z]+
.