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 !
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 le mal nommé de Java .matches()
méthode... Il essaie et correspond à TOUTES les entrées. Malheureusement, d'autres langues ont suivi le mouvement :(
Si vous voulez voir si l'expression rationnelle correspond à un texte d'entrée, utilisez la fonction Pattern
, a Matcher
et le .find()
de la méthode du matcheur :
Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher(inputstring);
if (m.find())
// match
Si ce que vous voulez est effectivement de voir si une entrée ne comporte que des lettres minuscules, vous pouvez utiliser .matches()
mais vous devez faire correspondre un ou plusieurs caractères : append a +
à la classe de votre personnage, comme dans [a-z]+
. Ou utilisez ^[a-z]+$
y .find()
.
Je trouve des centaines de tutoriels incomplets en ligne. Je n'ai pas réussi à en trouver un bon. Avez-vous des suggestions ?
Merci @fge pour l'explication .matches()
. Peut-être savez-vous pourquoi .find()
fonctionne si lentement en cet exemple ?
Qu'entendez-vous par d'autres langues ont suivi ? D'après ce que je sais, seul le C++ dispose d'un ensemble de méthodes équivalentes. regex_search
y regex_match
. En Python, re.match
n'ancre la correspondance qu'au début de la chaîne (comme s'il s'agissait de \Apattern
) et Python 3.x dispose d'une belle fonction .fullmatch()
méthode. En JS, Go, PHP et .NET, il n'y a pas de méthodes regex qui ancrent la correspondance implicitement. Les motifs Angluar d'ElasticSearch, XML Schema et HTML5/Validators sont toujours ancrés par défaut. En Swift/Objective C, il existe un moyen d'ancrer le motif au début avec une option.
Bien sûr que ça correspond à un seul caractère, c'est ce que fait cette regexp ! Ce qui n'est pas clair cependant (et ne devrait pas l'être non plus !) c'est que java met le préfixe ^
et le suffixe $
autour de la regexp fournie, la modifiant de façon indésirable et créant des bogues bizarres. Ils ne devraient pas le faire, car ce n'est pas ainsi que la regexp initiale a été conçue.
L'implémentation java des regex essaie de correspondre à la chaîne entière.
c'est différent des regex en perl, qui essaient de trouver une partie correspondante
si vous voulez trouver une chaîne de caractères ne contenant que des minuscules, utilisez le motif [a-z]+
si vous voulez trouver une chaîne contenant au moins un caractère minuscule, utilisez le modèle .*[a-z].*
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
48 votes
Java
matches
met un ^ au début et un $ à la fin des regex pour vous. Doncmatches("[a-z]")
cherchera en fait /^[a-z]$/ à la place.0 votes
Oui @Robino vous avez tout à fait raison.
3 votes
Sûrement, si vous attendez
matches
pour rechercher toute occurrence de[a-z]
alors il devrait correspondre à tous les éléments ? Je ne m'attendrais pas à ce quematches
pour vérifier chaque caractère individuellement par rapport à la regex.0 votes
@Robino : Où cette fonctionnalité est-elle décrite/documentée ?
0 votes
@Toru Sur la page de la docs java pour String.Matches - où d'autre ? Une recherche occasionnelle sur Google de "java string matches documentation" révèle, dans le premier résultat, la phrase "str.matches(regex) yields exactly the same result as the expression". Le mot important est "exactement".
0 votes
@PhilHibbs Oui, c'était aussi mon attente !