web-dev-qa-db-fra.com

Comment trouver le mot exact en utilisant un regex en Java?

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.

18
A Null Pointer

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.

32
DNA

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:

  1. (? i) - ignorecase
  2. . *? - autorise (au choix) tous les caractères avant
  3. \b - Limite de mots
  4. % s - variable à modifier par String.format (entre guillemets pour éviter les erreurs regex )
  5. \b - Limite de mots
  6. . *? - autorise (au choix) tous les caractères après
9
surfealokesea

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"));
4
Paolo Falabella

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.

  • 0ème groupe - ABCD
  • 1er groupe - BC
  • 2e groupe - C

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"

3
teoREtik

Votre searchString va-t-il être expression régulière? sinon, utilisez simplement String.contains (CharSequence s)

1
Kuldeep Jain

System.out.println (input.matches (". * \\ bthis $"));

Travaille également. Ici, le. * Correspond à tout ce qui se trouve avant l'espace et ensuite, cela correspond à Word.

0