String.contains
String.containsработает со строкой, точка. Это не работает с регулярным выражением. Он проверит, отображается ли указанная строка в текущей строке или нет.
Обратите внимание, что String.containsне проверяется граница слова; он просто проверяет наличие подстроки.
Решение Regex
Regex более эффективен, чем String.contains, поскольку вы можете установить границу слов для ключевых слов (среди прочего). Это означает, что вы можете искать ключевые слова как слова , а не просто подстроки .
Используйте String.matchesсо следующим регулярным выражением:
"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"
Регулярное выражение RAW (удалите экранирование, сделанное в строковом литерале - это то, что вы получите, распечатав строку выше):
(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*
В \bпроверяет границы слова, так что вы не получите спичку restores store products. Обратите внимание, что stores 3store_productэто также отклоняется, поскольку цифры и _считаются частью слова, но я сомневаюсь, что этот регистр появляется в естественном тексте.
Поскольку граница слова проверяется с обеих сторон, регулярное выражение выше будет искать точные слова. Другими словами, stores stores productне будет соответствовать регулярному выражению выше, так как вы ищете слово storeбез s.
.обычно соответствует любому символу, кроме нескольких символов новой строки . (?s)в начале .соответствует любому символу без исключения (спасибо Тиму Пицкеру за указание на это).
(?s)в начало вашего регулярного выражения, если строка содержит символы новой строки.