具有多个单词(以任何顺序)的正则表达式,无需重复

DNR*_*DNR 5 javascript regex search

我正在尝试在字符串列表上执行排序搜索(使用JavaScript).列表中的每个字符串都有多个单词.

搜索查询还可以包括多个单词,但单词的顺序无关紧要.

例如,在字符串"This is a random string"上,查询"trin and is"应匹配.但是,这些术语不能重叠.例如,"随机随机"作为对同一字符串的查询不应匹配.

我将根据相关性对结果进行排序,但我自己也应该没有问题,我只是无法弄清楚如何建立正则表达式.有任何想法吗?

Mar*_*ers 5

查询trin and is变为以下正则表达式:

/trin.*(?:and.*is|is.*and)|and.*(?:trin.*is|is.*trin)|is.*(?:trin.*and|and.*trin)/
Run Code Online (Sandbox Code Playgroud)

换句话说,不要为此使用正则表达式。


Lau*_*ves 4

仅使用正则表达式来执行此操作可能不是一个好主意。(纯粹的计算机科学)正则表达式“无法计数”。它在任何时刻拥有的唯一“记忆”是 DFA 的状态。要以任意顺序匹配多个单词而不重复,您需要 2^n 个状态的顺序。所以可能是一个非常可怕的正则表达式。

(旁白:我提到“纯粹的计算机科学”正则表达式是因为大多数实现实际上是一个扩展,让你做一些非常规的事情。我不知道有任何扩展,当然 JavaScript 中没有,这使得做什么你想用单一模式来减少痛苦。)

更好的方法是保留一个从单词映射到计数的字典(JavaScript 中的对象)。将其初始化为您的单词集,并为每个单词设置适当的计数。您可以使用正则表达式来匹配单词,然后对于找到的每个单词,递减字典中相应的条目。如果字典末尾包含任何非 0 值,或者在某个地方尝试过度递减一个值(或递减一个不存在的值),那么匹配就会失败。