我正在尝试为项目构建搜索功能,该项目根据用户搜索输入缩小项目,如果它与针对项目列出的关键字匹配。为此,我将项目关键字保存在data
属性中,并使用RegExp模式将查询与这些关键字匹配。
我目前正在使用这个表达式,我知道这个表达方式不正确,需要你的帮助:
new RegExp('\\b(' + query + ')', 'gi')))
其中查询是|
用户输入的查询的分隔值(例如\\b(meat|pasta|dinner)
)。即使只有一个匹配项,也会返回一个匹配项,例如 - meat
只是抛出一些背景,这是一个小例子:
如果用户输入:meat pasta dinner
,则应列出所有包含3个关键字的项目,即meat
pasta
和dinner
。这些与他们输入的顺序无关。
你能帮我一个表达式,它会以任何顺序匹配查询中的所有单词吗?
答案 0 :(得分:56)
你可以实现这一前瞻性断言
^(?=.*\bmeat\b)(?=.*\bpasta\b)(?=.*\bdinner\b).+
(?=.*\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();
}