Для поиска в массиве из нескольких тысяч строк использую такое регулярное выражение:
/(?=.*(\s|^|-)слово1)(?=.*(\s|^|-)слово2)(?=.*(\s|^|-)слово3)/.test.arr[i]
Оно использует упреждение для того чтобы найти в массиве те строки в которых встречаются все слова из запроса пользователя в любом порядке, причём поиск совпадения каждого конкретного слова идёт с его начала, а не откуда нибудь из середины.
Проблема в том, что когда пользователь вводит два повторяющихся слова "баден баден" такое регулярное выражение, понятное дело, находит совпадение в строке массива из одного единственного слова "баден". Как можно это подправить? Ну, чтобы не находило. Насколько я понял нужно как то запомнить то, что уже нашли.