Vous devez utiliser l'anticipation comme l'ont dit certains des autres répondants, mais l'anticipation doit tenir compte des autres caractères entre son mot cible et la position de correspondance actuelle. Par exemple:
(?=.*word1)(?=.*word2)(?=.*word3)
Le .*
premier lookahead lui permet de faire correspondre le nombre de caractères dont il a besoin avant d'arriver à "word1". Ensuite, la position de correspondance est réinitialisée et le deuxième moteur de recherche recherche "word2". Réinitialisez à nouveau et la partie finale correspond à "word3"; puisque c'est le dernier mot que vous recherchez, il n'est pas nécessaire qu'il soit dans une impasse, mais cela ne fait pas de mal.
Pour faire correspondre un paragraphe entier, vous devez ancrer l'expression régulière aux deux extrémités et ajouter une finale .*
pour consommer les caractères restants. En utilisant la notation de style Perl, ce serait:
/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m
Le modificateur «m» est pour le mode multiligne; il laisse le ^
et $
correspondre aux limites de paragraphe ("limites de ligne" en regex-parler). Dans ce cas, il est essentiel de ne pas utiliser le modificateur «s», qui permet au métacaractère point de correspondre aux nouvelles lignes ainsi qu'à tous les autres caractères.
Enfin, vous voulez vous assurer que vous faites correspondre des mots entiers et pas seulement des fragments de mots plus longs, vous devez donc ajouter des limites de mots:
/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m