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