String.contains
String.containstrabalha com String, ponto final. Não funciona com regex. Ele verificará se a String exata especificada aparece na String atual ou não.
Observe que String.containsnão verifica o limite da palavra; ele simplesmente verifica a substring.
Solução Regex
Regex é mais poderoso do que String.contains, uma vez que você pode impor limites de palavras nas palavras-chave (entre outras coisas). Isso significa que você pode pesquisar as palavras-chave como palavras , em vez de apenas substrings .
Use String.matchescom o seguinte regex:
"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"
O regex RAW (remova o escape feito no literal de string - isso é o que você obtém quando imprime a string acima):
(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*
A \bverificação de limite de palavra, para que você não obtenha uma correspondência para restores store products. Observe que stores 3store_producttambém é rejeitado, uma vez que dígito e_ são considerados parte de uma palavra, mas eu duvido que esse caso apareça em texto natural.
Como o limite da palavra é verificado para ambos os lados, o regex acima irá pesquisar por palavras exatas. Em outras palavras, stores stores productnão corresponderá ao regex acima, pois você está procurando pela palavra storesem s.
.normalmente corresponde a qualquer caractere, exceto um número de caracteres de nova linha . (?s)no início faz .combinações com qualquer caractere sem exceção (obrigado a Tim Pietzcker por apontar isso).
(?s)ao início de sua regex, caso a string contenha novas linhas.