正则表达式以任何顺序匹配查询中的所有单词

时间:2012-12-17 09:01:37

标签: javascript jquery regex

我正在尝试为项目构建搜索功能,该项目根据用户搜索输入缩小项目,如果它与针对项目列出的关键字匹配。为此,我将项目关键字保存在data属性中,并使用RegExp模式将查询与这些关键字匹配。

我目前正在使用这个表达式,我知道这个表达方式不正确,需要你的帮助:

new RegExp('\\b(' + query + ')', 'gi')))其中查询是|用户输入的查询的分隔值(例如\\b(meat|pasta|dinner))。即使只有一个匹配项,也会返回一个匹配项,例如 - meat

只是抛出一些背景,这是一个小例子:

如果用户输入:meat pasta dinner,则应列出所有包含3个关键字的项目,即meat pastadinner。这些与他们输入的顺序无关。

你能帮我一个表达式,它会以任何顺序匹配查询中的所有单词吗?

3 个答案:

答案 0 :(得分:56)

你可以实现这一前瞻性断言

^(?=.*\bmeat\b)(?=.*\bpasta\b)(?=.*\bdinner\b).+

here on Regexr

(?=.*\bmeat\b)positive lookahead assertion,可确保\bmeat\b位于字符串中的某个位置。对于其他关键字也是如此,.+实际上匹配整个字符串,但前提是断言为真。

但它也会与“晚餐肉Foobar面食”相匹配

答案 1 :(得分:4)

你的正则表达式看起来很不错:

\b(meat|pasta|dinner)\b

检查匹配的长度是否等于关键字的数量(在本例中为3):

string.match(re).length === numberOfKeywords

其中re是带有g标记的正则表达式,string是数据,numberOfKeywords是关键字数

这假设没有重复的关键字。

答案 2 :(得分:2)

根据接受的答案,我写了一个简单的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();
}