web-dev-qa-db-fra.com

L'expression régulière 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 !!

106
John

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

263
fge

[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. 

32
dogbane

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

16
Hachi

String.matches indique si le caractère entier correspond à la regex, pas à n'importe quelle sous-chaîne.

14
yshavit

Utilisé

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

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

4
Shanta

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

0
user647772