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