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!