正则表达式以任何顺序匹配查询中的所有单词
我正在尝试为项目构建搜索function,该项目根据用户搜索输入缩小项目,如果它与项目列出的关键字相匹配。 为此,我将项目关键字保存在data
属性中,并使用RegExp模式将查询与这些关键字匹配。
我目前正在使用这个表达式,我知道这是不正确的,需要你的帮助:
new RegExp('\\b(' + query + ')', 'gi')))
其中查询是|
用户输入的查询的分隔值(例如\\b(meat|pasta|dinner)
)。 即使只有一场比赛,这也会给我一个匹配,比如说 – meat
只是为了抛出一些背景,这是一个小例子:
如果用户输入: meat pasta dinner
,则应列出所有具有所列出的3个关键字的项目,即meat
pasta
和dinner
。 这些与他们输入的顺序无关。
你能帮我一个表达式,它会以任何顺序匹配查询中的所有单词吗?
你可以实现这一前瞻性断言
^(?=.*\bmeat\b)(?=.*\bpasta\b)(?=.*\bdinner\b).+
在Regexr上看到它
(?=.*\bmeat\b)
是一个积极的先行断言 ,它确保\bmeat\b
在字符串中的某个位置。 其他关键字相同,而.+
实际上匹配整个字符串,但仅在断言为真时才匹配。
但它也将与“晚餐肉Foobar面食”相匹配
你的正则表达式看起来很不错:
\b(meat|pasta|dinner)\b
检查匹配长度是否等于关键字数量(在本例中为3):
string.match(re).length === numberOfKeywords
其中re
是带有g
标志的正则表达式, string
是数据, numberOfKeywords
是关键字的数量
这假定没有重复的关键字。
根据接受的答案,我写了一个简单的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(); }