162 votes

Regex ne fonctionne pas dans String.matches()

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 !

48 votes

Java matches met un ^ au début et un $ à la fin des regex pour vous. Donc matches("[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 que matches pour vérifier chaque caractère individuellement par rapport à la regex.

355voto

fge Points 40850

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() .

2 votes

Je trouve des centaines de tutoriels incomplets en ligne. Je n'ai pas réussi à en trouver un bon. Avez-vous des suggestions ?

0 votes

Merci @fge pour l'explication .matches() . Peut-être savez-vous pourquoi .find() fonctionne si lentement en cet exemple ?

4 votes

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.

47voto

dogbane Points 85749

[a-z] correspond à un simple entre a et z. Donc, si votre chaîne de caractères était juste "d" par exemple, il aurait alors correspondu et aurait été imprimé.

Vous devez changer votre regex en [a-z]+ pour correspondre à un ou plusieurs caractères.

13 votes

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.

31voto

yshavit Points 15028

String.matches retourne si le ensemble du site correspond à l'expression rationnelle, et non à n'importe quelle sous-chaîne.

3 votes

Ce qui est vraiment une triste réalité, c'est que vous avez raison. Je ne sais vraiment pas pourquoi ils ont agi de cette façon.

17voto

Hachi Points 1701

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].*

0 votes

Plus d'infos aquí

3 votes

Pourquoi est-ce que non documenté ? !

13voto

Boni Points 570

Utilisé

String[] words = {"{apf","hum_","dkoe","12f"};
    for(String s:words)
    {
        if(s.matches("[a-z]+"))
        {
            System.out.println(s);
        }
    }

Prograide.com

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.

Powered by:

X