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

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

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

new RegExp('\\b(' + query + ')', 'gi')))其中查询是| 用户输入的查询的分隔值(例如\\b(meat|pasta|dinner) )。 即使只有一场比赛,这也会给我一个匹配,比如说 – meat

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

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

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

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

 ^(?=.*\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(); }