Você precisa usar o lookahead, como alguns dos outros respondentes disseram, mas o lookahead deve contabilizar outros caracteres entre a palavra-alvo e a posição atual de correspondência. Por exemplo:
(?=.*word1)(?=.*word2)(?=.*word3)
O .*
primeiro lookahead permite combinar o número de caracteres necessário antes de chegar a "word1". Em seguida, a posição da partida é redefinida e o segundo lookahead procura "word2". Redefina novamente e a parte final corresponde a "palavra3"; como é a última palavra que você está procurando, não é necessário que ele fique de cabeça para baixo, mas não dói.
Para corresponder a um parágrafo inteiro, você precisa ancorar a regex nas duas extremidades e adicionar uma final .*
para consumir os caracteres restantes. Usando a notação no estilo Perl, isso seria:
/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m
O modificador 'm' é para o modo multilinha; permite que o ^
e $
corresponda aos limites do parágrafo ("limites da linha" na expressão regular). Nesse caso, é essencial que você não use o modificador 's', que permite que o metacaractere de ponto corresponda às novas linhas, bem como a todos os outros caracteres.
Finalmente, você quer ter certeza de que está combinando palavras inteiras e não apenas fragmentos de palavras mais longas; portanto, é necessário adicionar limites de palavras:
/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m