String.contains
String.contains
fonctionne avec String, point final. 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 actuelle.
Notez que String.contains
cela ne vérifie pas la limite du mot; il vérifie simplement la sous-chaîne.
Solution regex
Regex est plus puissant que String.contains
, puisque vous pouvez appliquer une limite de mot sur les mots-clés (entre autres). Cela signifie que vous pouvez rechercher les mots-clés sous forme de mots , plutôt que de simples sous - chaînes .
À utiliser String.matches
avec l'expression rationnelle suivante:
"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"
Le regex RAW (supprimez l'échappement effectué dans la chaîne littérale - c'est ce que vous obtenez lorsque vous imprimez la chaîne ci-dessus):
(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*
Les \b
vérifications de la limite du mot, de sorte que vous n'obteniez pas de correspondance restores store products
. Notez que stores 3store_product
c'est également rejeté, car digit et _
sont considérés comme faisant partie d'un mot, mais je doute que ce cas apparaisse dans le texte naturel.
Puisque la limite de mot est vérifiée pour les deux côtés, l'expression régulière ci-dessus recherchera des mots exacts. En d'autres termes, stores stores product
ne correspondra pas à l'expression régulière ci-dessus, car vous recherchez le mot store
sans s
.
.
correspond normalement à n'importe quel caractère sauf un certain nombre de caractères de nouvelle ligne . (?s)
au début fait des .
correspondances avec n'importe quel caractère sans exception (merci à Tim Pietzcker pour l'avoir signalé).
(?s)
au début de votre expression régulière au cas où la chaîne contiendrait des sauts de ligne.\\b
\
pour en spécifier un seul\
, il\\b
sera donc interprété comme\b
, comme indiqué dans l'expression régulière RAW.\b
correspond à la limite du mot, comme expliqué ci-dessus.matcher.find()
fait ce dont vous aviez besoin. Exemple:la source
Vous pouvez simplement utiliser la
matches
méthode de la classe String.la source
.*
ou cela ne correspondra qu'aux chaînes commençant parstores
.Si vous voulez vérifier si une chaîne contient une sous-chaîne ou si vous n'utilisez pas de regex, le plus proche que vous pouvez faire est d'utiliser find () -
Notez la différence entre matches () et find (), matches () retournent true si la chaîne entière correspond au modèle donné. find () essaie de trouver une sous-chaîne qui correspond au modèle dans une chaîne d'entrée donnée. De plus, en utilisant find (), vous n'avez pas à ajouter de correspondance supplémentaire comme - (? S). * Au début et. * À la fin de votre modèle d'expression régulière.
la source
1. résultat: vrai
2. résultat: vrai
la source
fromIndex
est ignoré, n'est-ce pas?contains("something", test, 5) => true