Вам потрібно використовувати lookahead, як сказали деякі інші відповіді, але lookahead повинен враховувати інші символи між його цільовим словом та поточною позицією відповідності. Наприклад:
(?=.*word1)(?=.*word2)(?=.*word3)
.*
У першому випереджаючого перегляду дозволяє йому відповідати тим НЕ менш багато символів, які необхідні , щоб , перш ніж він потрапляє в «word1». Потім положення матчу скидається, а другий локохед шукає "word2". Знову скиньте, а заключна частина відповідає "word3"; оскільки це останнє слово, на яке ви перевіряєте, не обов’язково, щоб воно було в пошуку, але це не боляче.
Для того, щоб відповідати цілому абзацу, вам потрібно прив’язати регулярний вираз з обох кінців і додати фінал, .*
щоб споживати залишилися символи. Використовуючи позначення стилю Perl, це було б:
/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m
Модифікатор 'm' призначений для багаторядкового режиму; він дозволяє ^
і $
збігатись на межі абзацу ("межі ліній" в регулярному вираженні). У цьому випадку важливо, щоб ви не використовували модифікатор 's', який дозволяє метахарактеру точок відповідати новим рядкам, а також усім іншим символам.
Нарешті, ви хочете переконатися, що ви узгоджуєте цілі слова, а не лише фрагменти довших слів, тому вам потрібно додати межі слів:
/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m