Maison >Java >javaDidacticiel >Pourquoi la méthode String.matches() de Java ne parvient-elle pas à faire correspondre les chaînes contenant plusieurs caractères minuscules lors de l'utilisation d'une expression régulière simple telle que « [a-z] » ?

Pourquoi la méthode String.matches() de Java ne parvient-elle pas à faire correspondre les chaînes contenant plusieurs caractères minuscules lors de l'utilisation d'une expression régulière simple telle que « [a-z] » ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-26 08:30:16405parcourir

Why Does Java's String.matches() Method Fail to Match Strings Containing Multiple Lowercase Characters When Using a Simple Regex Like

Anomalie Regex String.matches() : dévoilement du piège caché des Regex

En programmation Java, la méthode String.matches() ressemble à une manière intuitive de valider des chaînes par rapport à des expressions régulières. Cependant, son comportement peut prêter à confusion, surtout lorsqu'on le compare à d'autres langages de programmation.

Considérez l'extrait de code suivant :

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

Ce code est destiné à imprimer uniquement la chaîne "dkoe" puisque il ne contient que des caractères alphabétiques minuscules. Cependant, étonnamment, il n’imprime rien ! Pourquoi est-ce le cas ?

Le nœud du problème réside dans la nature de la méthode String.matches(). Contrairement aux méthodes similaires dans d'autres langages, matches() tente de faire correspondre l'intégralité de la chaîne d'entrée à l'expression régulière fournie. En d'autres termes, il vérifie si la chaîne entière correspond au modèle.

L'expression régulière "[a-z]" ne correspond qu'à un seul caractère alphabétique minuscule. Étant donné qu'aucune des chaînes d'entrée ne contient qu'une seule lettre minuscule, la méthode matches() ne parvient à trouver de correspondance pour aucune des chaînes.

Pour résoudre ce problème, deux approches peuvent être adoptées :

Approche 1 : Utilisation de modèles et de matchers

Pattern p = Pattern.compile("[a-z]+");
Matcher m = p.matcher(inputString);
if (m.find()) {
    // match found
}

Cette approche utilise un modèle et un matcher pour trouver le premier occurrence d'une correspondance dans la chaîne d'entrée. L'expression régulière « [a-z] » correspond à un ou plusieurs caractères alphabétiques minuscules, ce qui est le comportement souhaité.

Approche 2 : Ajout de « » à la classe de caractères

Pour des cas simples, comme vérifier si une chaîne ne contient que des lettres minuscules, vous pouvez modifier l'expression régulière comme suit :

if(s.matches("[a-z]+")) {
    // match found
}

Par en ajoutant ' ' à la classe de caractères "[a-z]", l'expression régulière correspond à un ou plusieurs caractères alphabétiques minuscules, résolvant ainsi efficacement le problème.

En comprenant le comportement particulier de String.matches() et en utilisant les alternatives à condition, vous pouvez éviter ce piège courant et valider efficacement les chaînes par rapport aux expressions régulières en Java.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn