Регулярное выражение для MATCH ВСЕ слова в запросе в любом порядке
Я пытаюсь создать функцию поиска для проекта, который сужает элементы на основе ввода пользовательского поиска, и если он соответствует ключевым словам, указанным в отношении элементов. Для этого я сохраняю ключевые слова элемента в атрибуте data
и сопоставляя запрос с этими ключевыми словами, используя шаблон RegExp.
В настоящее время я использую это выражение, которое, как я знаю, неверно и вам нужна ваша помощь:
new RegExp('\\b(' + query + ')', 'gi')))
где запрос |
разделенные значения запроса, введенного пользователем (например, \\b(meat|pasta|dinner)
). Это возвращает мне совпадение, даже если есть только 1 совпадение, скажем, например - meat
Просто, чтобы бросить какой-то контекст, вот небольшой пример:
Если пользователь вводит: meat pasta dinner
, он должен перечислить все элементы, у которых есть ВСЕ 3 ключевых слова, указанных против них, т.е. meat
pasta
и dinner
. Они не зависят от порядка, в котором они введены.
Можете ли вы помочь мне с выражением, которое будет соответствовать всем словам в запросе в любом порядке?
Ответы
Ответ 1
Вы можете достичь этого, если будете смотреть утверждения
^(?=.*\bmeat\b)(?=.*\bpasta\b)(?=.*\bdinner\b).+
Смотрите здесь, в Regexr
(?=.*\bmeat\b)
является положительным утверждением lookahead, который гарантирует, что \bmeat\b
находится где-то в строке. То же самое для других ключевых слов, а .+
тогда фактически соответствует всей строке, но только если утверждения верны.
Но это будет совпадать и с "обеденным мясом Foobar pasta"
Ответ 2
ваше регулярное выражение выглядит довольно хорошо:
\b(meat|pasta|dinner)\b
Убедитесь, что длина совпадений равна числу ключевых слов (в данном случае три):
string.match(re).length === numberOfKeywords
где re
- это регулярное выражение с флагом g
, string
- это данные, а numberOfKeywords
- количество ключевых слов
Это предполагает, что повторных ключевых слов нет.
Ответ 3
На основе принятого ответа я написал простой Java-метод, который создает регулярное выражение из массива ключевых слов
public static String regexIfAllKeywordsExists(String[] keywords) {
StringBuilder sb = new StringBuilder("^");
for (String keyword : keywords) {
sb.append("(?=.*\\b");
sb.append(keyword);
sb.append("\\b)");
}
sb.append(".+");
return sb.toString();
}