Подтвердить что ты не робот

Регулярное выражение для MATCH ВСЕ слова в запросе в любом порядке

Я пытаюсь создать функцию поиска для проекта, который сужает элементы на основе ввода пользовательского поиска, и если он соответствует ключевым словам, указанным в отношении элементов. Для этого я сохраняю ключевые слова элемента в атрибуте data и сопоставляя запрос с этими ключевыми словами, используя шаблон RegExp.

В настоящее время я использую это выражение, которое, как я знаю, неверно и вам нужна ваша помощь:

new RegExp('\\b(' + query + ')', 'gi'))) где запрос | разделенные значения запроса, введенного пользователем (например, \\b(meat|pasta|dinner)). Это возвращает мне совпадение, даже если есть только 1 совпадение, скажем, например - meat

Просто, чтобы бросить какой-то контекст, вот небольшой пример:

Если пользователь вводит: meat pasta dinner, он должен перечислить все элементы, у которых есть ВСЕ 3 ключевых слова, указанных против них, т.е. meat pasta и dinner. Они не зависят от порядка, в котором они введены.

Можете ли вы помочь мне с выражением, которое будет соответствовать всем словам в запросе в любом порядке?

4b9b3361

Ответ 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();
}