web-dev-qa-db-fra.com

Comment utiliser regex dans la méthode String.contains () en Java

Je veux vérifier si une chaîne contient les mots "magasins", "magasin" et "produit" dans cet ordre. Peu importe ce qui se trouve entre eux.

J'ai essayé d'utiliser someString.contains(stores%store%product); et aussi .contains("stores%store%product");

Dois-je déclarer explicitement une expression régulière et la transmettre à la méthode ou je ne peux pas transmettre une expression régulière?

92
vipin8169

String.contains

String.contains fonctionne avec String, point. Cela ne fonctionne pas avec regex. Il vérifiera si la chaîne exacte spécifiée apparaît ou non dans la chaîne en cours.

Notez que String.contains ne vérifie pas la limite de Word; il vérifie simplement la sous-chaîne.

Solution de regex

Regex est plus puissant que String.contains, car vous pouvez appliquer une limite de Word aux mots-clés (entre autres). Cela signifie que vous pouvez rechercher les mots-clés en tant que mots plutôt que simplement sous-chaînes.

Utilisez String.matches avec les expressions rationnelles suivantes:

"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"

La regex RAW (supprime l'échappement dans le littéral de chaîne - c'est ce que vous obtenez lorsque vous imprimez la chaîne ci-dessus):

(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*

Le \b vérifie la limite de mot, de sorte que vous n'obtenez pas de correspondance pour restores store products. Notez que stores 3store_product est également rejeté, car digit et _ sont considérés comme faisant partie d'un mot, mais je doute que ce cas apparaisse en texte naturel.

Puisque la limite de mot est cochée pour les deux côtés, la regex ci-dessus cherchera les mots exacts. En d'autres termes, stores stores product ne correspondra pas à l'expression régulière ci-dessus, car vous recherchez Word store sans s.

. correspond normalement à n'importe quel caractère saufun nombre de caractères de nouvelle ligne . (?s) au début permet à . de faire correspondre n'importe quel caractère sans exception (merci à Tim Pietzcker de l'avoir signalé).

104
nhahtdh

matcher.find() fait ce dont vous aviez besoin. Exemple:

Pattern.compile("stores.*store.*product").matcher(someString).find();
84
eugene82

Vous pouvez simplement utiliser la méthode matches de la classe String.

boolean result = someString.matches("stores.*store.*product.*");
15
san1deep2set3hi
public static void main(String[] args) {
    String test = "something hear - to - find some to or tows";
    System.out.println("1.result: " + contains("- to -( \\w+) som", test, null));
    System.out.println("2.result: " + contains("- to -( \\w+) som", test, 5));
}
static boolean contains(String pattern, String text, Integer fromIndex){
    if(fromIndex != null && fromIndex < text.length())
        return Pattern.compile(pattern).matcher(text).find();

    return Pattern.compile(pattern).matcher(text).find();
}

1. résultat: true

2. résultat: true

1
Ar maj

Si vous voulez vérifier si une chaîne contient une sous-chaîne ou si vous n'utilisez pas regex, vous pouvez le faire au moyen de find () - 

    private static final validPattern =   "\\bstores\\b.*\\bstore\\b.*\\bproduct\\b"
    Pattern pattern = Pattern.compile(validPattern);
    Matcher matcher = pattern.matcher(inputString);
    System.out.print(matcher.find()); // should print true or false.

Notez la différence entre matches () et find (). Matches () renvoie true si toute la chaîne correspond au modèle donné. find () tente de trouver une sous-chaîne qui correspond au modèle d'une chaîne d'entrée donnée. De plus, en utilisant find (), vous n’aurez pas à ajouter de correspondance supplémentaire comme - (? S). * Au début et. * À la fin de votre modèle regex. 

0
P C