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.

5voto

Shanta Points 51

J'ai rencontré le 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 le modèle dans ( y ) .

2voto

Votre expression régulière [a-z] ne correspond pas dkoe car il ne correspond qu'aux chaînes de longueur 1. Utilisez quelque chose comme [a-z]+ .

-2voto

MohsenB Points 339

Vous devez mettre au moins une capture () dans le motif à faire correspondre, et un motif correct comme celui-ci :

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

0 votes

Les parenthèses n'ont rien changé.

0 votes

@Touniouk sans parenthèses matches n'a pas de sortie.

-3voto

Anita Kulkarni Points 304

Vous pouvez rendre votre motif insensible à la casse en faisant :

Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);

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