Comment vérifier si une chaîne contient une sous-chaîne en Java
Recherchez une sous-chaîne en Java avec contains, indexOf, startsWith, endsWith et les expressions régulières.
Vérifier si une String apparaît dans une autre est l'une des tâches textuelles les plus courantes en Java. Le bon outil dépend de ce dont vous avez réellement besoin : une simple réponse oui/non, la position de la correspondance, une vérification ancrée au début ou à la fin, ou un motif flexible. Ce chapitre présente chaque approche idiomatique et quand l'utiliser.
Par défaut : String.contains
Lorsque vous n'avez besoin que d'un boolean — « ce fragment est-il présent ou non ? » — contains est le choix le plus clair :
String text = "The quick brown fox";
boolean hasFox = text.contains("fox"); // true
boolean hasCat = text.contains("cat"); // falsecontains accepte tout CharSequence (donc String, StringBuilder, etc.) et retourne true si l'argument apparaît n'importe où dans la chaîne. Il est sensible à la casse : text.contains("FOX") vaut false. Un cas particulier à retenir — la chaîne vide est contenue dans chaque chaîne, donc text.contains("") est toujours true.
Quand vous avez besoin de la position : indexOf
contains est en réalité implémenté au-dessus de indexOf. Si vous devez savoir où commence une correspondance (ou si vous souhaitez rechercher des répétitions), appelez indexOf directement :
String text = "The quick brown fox";
int at = text.indexOf("brown"); // 10
int no = text.indexOf("bird"); // -1indexOf retourne l'index à base zéro de la première correspondance, ou -1 lorsque la sous-chaîne est absente. L'idiome classique d'appartenance est text.indexOf("brown") >= 0, ce qui est équivalent à contains mais vous donne également la position gratuitement. Il existe aussi lastIndexOf pour chercher depuis la fin, ainsi qu'une surcharge prenant un décalage de départ pour trouver des correspondances successives dans une boucle.
Vérifications ancrées : startsWith et endsWith
Si vous vous souciez spécifiquement du début ou de la fin d'une chaîne — extensions de fichiers, préfixes d'URL, schémas de protocole — startsWith et endsWith expriment l'intention directement et sont plus lisibles que le découpage :
String file = "report.pdf";
boolean isPdf = file.endsWith(".pdf"); // true
boolean isHttp = "https://w3docs.com".startsWith("https://"); // trueCes méthodes sont plus rapides et plus claires que indexOf(prefix) == 0, car elles s'arrêtent dès qu'un caractère diffère et n'analysent jamais toute la chaîne.
Recherche insensible à la casse et par motif
contains n'a pas de surcharge insensible à la casse. La solution la plus simple consiste à normaliser les deux côtés :
boolean ci = text.toLowerCase().contains("FOX".toLowerCase()); // truePour plus qu'un fragment littéral — alternatives, caractères génériques, limites de mots — utilisez une expression régulière. Pattern.compile(...).matcher(text).find() retourne true si le motif correspond n'importe où, et CASE_INSENSITIVE gère la casse sans allouer de copies en minuscules :
import java.util.regex.Pattern;
boolean found = Pattern.compile("fox", Pattern.CASE_INSENSITIVE)
.matcher(text).find();| Approche | Retourne | Utiliser quand |
|---|---|---|
contains | boolean | Appartenance simple, texte littéral |
indexOf | int (position, ou -1) | Vous avez besoin de savoir où se trouve la correspondance |
startsWith / endsWith | boolean | Ancré au début ou à la fin |
Pattern.find | boolean | Motifs, alternatives, insensible à la casse |
Un exemple concret
Ce programme exécute les quatre approches côte à côte sur une phrase, y compris le piège de la sensibilité à la casse et le cas particulier de la chaîne vide.
Ce qu'il faut retenir de l'exécution :
contains "brown"affichetrueetcontains "cat"affichefalse—containsest le test d'appartenance boolean direct pour le texte littéral.contains "FOX"affichefalsemême si le mot « fox » est présent, ce qui prouve quecontainsest sensible à la casse ; la ligne normaliséecontains "FOX" (ci)affichetrue.indexOf "fox"affiche16, la position à base zéro du début de la correspondance, tandis queindexOf "bird"affiche-1pour signaler « non trouvé » — ce-1est la valeur sentinelle que vous testez.startsWith "The"etendsWith "dog"affichent tous deuxtrue, montrant les vérifications ancrées lisant le tout début et la toute fin de la phrase.contains ""affichetrue, rappelant que chaque chaîne contient la chaîne vide — protégez-vous contre les entrées vides si cela constituerait un bug.
Sujets connexes
- Java Strings — la base de chaque méthode présentée sur cette page.
- Java String Methods — la référence complète pour
contains,indexOf,startsWithet leurs homologues. - How to Compare Strings in Java — égalité et ordre, la suite naturelle de l'appartenance.
- Java Regex: Pattern and Matcher — approfondissez l'approche par motif présentée ci-dessus.