Considérez l'extrait de code suivant:
String input = "Print this";
System.out.println(input.matches("\\bthis\\b"));
Sortie
false
Qu'est-ce qui pourrait mal se passer avec cette approche? Si c'est faux, alors quelle est la bonne solution pour trouver la correspondance exacte de Word?
PS: J'ai trouvé une variété de questions similaires ici, mais aucune d’entre elles n’apporte la solution que je cherche… .. Merci d’avance.
Lorsque vous utilisez la méthode matches()
, elle essaie de faire correspondre l'entrée entière. Dans votre exemple, l'entrée "Imprimer ceci" ne correspond pas au modèle car le mot "Imprimer" ne correspond pas.
Vous devez donc ajouter quelque chose à la regex pour correspondre à la partie initiale de la chaîne, par exemple.
.*\\bthis\\b
Et si vous souhaitez également autoriser du texte supplémentaire à la fin de la ligne:
.*\\bthis\\b.*
Vous pouvez également utiliser un objet Matcher
et utiliser Matcher.find()
pour trouver des correspondances dans la chaîne d'entrée:
Pattern p = Pattern.compile("\\bthis\\b");
Matcher m = p.matcher("Print this");
m.find();
System.out.println(m.group());
Sortie:
this
Si vous souhaitez rechercher plusieurs correspondances sur une ligne, vous pouvez appeler find()
et group()
à plusieurs reprises pour les extraire toutes.
Exemple de méthode complète pour Matcher:
public static String REGEX_FIND_Word="(?i).*?\\b%s\\b.*?";
public static boolean containsWord(String text, String Word) {
String regex=String.format(REGEX_FIND_Word, Pattern.quote(Word));
return text.matches(regex);
}
Explique:
Pour une bonne explication, voir: http://www.regular-expressions.info/Java.html
myString.matches ("regex") renvoie true ou false selon que le fichier chaîne peut être entièrement associée à l'expression régulière. Il est Il est important de se rappeler que String.matches () ne renvoie vrai que si le fichier toute la chaîne peut être associée. En d'autres termes: "regex" est appliqué comme si vous aviez écrit "^ regex $" avec les ancres de début et de fin de chaîne. Ce est différent de la plupart des autres bibliothèques regex, où la méthode "quick match test" renvoie true si la regex peut être mise en correspondance n'importe où dans le fichier chaîne. Si myString est abc alors myString.matches ("bc") renvoie false . bc correspond à abc, mais ^ bc $ (ce qui est vraiment utilisé ici) ne le fait pas.
Cela écrit "vrai":
String input = "Print this";
System.out.println(input.matches(".*\\bthis\\b"));
Vous pouvez utiliser des groupes pour trouver le mot exact. API Regex spécifie les groupes entre parenthèses. Par exemple:
A(B(C))D
Cette instruction est composée de trois groupes, indexés à partir de 0.
Ainsi, si vous avez besoin de trouver un mot spécifique, vous pouvez utiliser deux méthodes dans la classe Matcher
telles que: find()
pour rechercher une instruction spécifiée par regex, puis obtenir un objet String
spécifié par son numéro de groupe:
String statement = "Hello, my beautiful world";
Pattern pattern = Pattern.compile("Hello, my (\\w+).*");
Matcher m = pattern.matcher(statement);
m.find();
System.out.println(m.group(1));
Le résultat du code ci-dessus sera "beau"
Votre searchString
va-t-il être expression régulière? sinon, utilisez simplement String.contains (CharSequence s)
System.out.println (input.matches (". * \\ bthis $"));
Travaille également. Ici, le. * Correspond à tout ce qui se trouve avant l'espace et ensuite, cela correspond à Word.