正则表达式javascript - 匹配多个搜索词忽略他们的顺序

时间:2012-01-10 18:50:05

标签: javascript regex

我想在字符串中找到给定字符串的所有匹配项(除以空格)。 (例如,iTunes搜索框的工作方式)。

例如,“ ab de ”和“ de ab ”将在“ abcde ”(也是“< em> bc ea “或任何订单应该返回true”

如果我用外卡替换空格,“ab * de”将在“ abcde ”上返回true,而不是“de * ab”。 [我只使用*而不是Regex语法来解释]

我找不到任何纯正的Regex解决方案。 我能想到的唯一解决方案是拆分搜索词并运行多个正则表达式。

是否有可能找到一个涵盖所有这些选项的纯正Regex表达式?

7 个答案:

答案 0 :(得分:5)

true的所有部分(除以,' ')出现在文本中时,返回searchString。否则返回false

filter(text, searchString) {
    const regexStr = '(?=.*' + searchString.split(/\,|\s/).join(')(?=.*') + ')';
    const searchRegEx = new RegExp(regexStr, 'gi');
    return text.match(searchRegEx) !== null;
}

答案 1 :(得分:4)

我很确定你能想出一个正则表达式来做你想做的事情,但它可能不是最有效的方法。

例如,正则表达式模式(?=.*bc)(?=.*e)(?=.*a)将匹配包含bce a的任何字符串。

var isMatch = 'abcde'.match(/(?=.*bc)(?=.*e)(?=.*a)/) != null; // equals true

var isMatch = 'bcde'.match(/(?=.*bc)(?=.*e)(?=.*a)/) != null; // equals false

您可以编写一个函数来根据搜索条件动态创建表达式,但是它是否是完成您正在执行的操作的最佳方法是另一个问题。

答案 2 :(得分:3)

试试这个:

var str = "your string";
str = str.split( " " );
for( var i = 0 ; i < str.length ; i++ ){
    // your regexp match
}

答案 3 :(得分:3)

轮换对顺序不敏感:

"abcde".match(/(ab|de)/g); // => ['ab', 'de']
"abcde".match(/(de|ab)/g); // => ['ab', 'de']

因此,如果您有一个匹配的单词列表,您可以像这样建立一个带有交替的正则表达式:

function regexForWordList(words) {
  return new RegExp('(' + words.join('|') + ')', 'g');
}
'abcde'.match(['a', 'e']); // => ['a', 'e']

答案 4 :(得分:2)

这是我使用的脚本 - 它也适用于单字searchStrings

var what="test string with search cool word";
var searchString="search word";
var search = new RegExp(searchString, "gi"); // one-word searching

// multiple search words
if(searchString.indexOf(' ') != -1) {

    search="";
    var words=searchString.split(" ");

    for(var i = 0; i < words.length; i++) {

        search+="(?=.*" + words[i] + ")";

    }

    search = new RegExp(search + ".+", "gi");

}

if(search.test(what)) {

    // found

} else {

    // notfound

}

答案 5 :(得分:1)

我假设您正在匹配单词或部分单词。您希望以空格分隔的搜索词来限制搜索结果,而您似乎只想返回那些包含用户提供的所有单词的条目。并且您希望通配符*代表匹配单词中的0个或更多字符。

例如,如果用户搜索单词 term1 term2 ,您打算只返回这两个单词的项目 term1 term2。如果用户搜索单词 term * ,则会匹配以term开头的任何单词。

有合适的正则表达式,它们与此搜索语言等效,可以从中生成。

一个简单的例子,单词term,可以通过转换为\bterm\b在正则表达式中声明。但是必须以任何顺序匹配的两个或多个单词需要先行断言。使用扩展语法,等效的正则表达式是:

(?= .* \b term1 \b )
(?= .* \b term2 \b )

可以在正则表达式中使用字符类后跟星号来声明星号通配符。字符类标识您认为哪些字母是单词的一部分。例如,您可能会发现[A-Za-z0-9]*适合该帐单。

简而言之,如果您转换表达式,例如:

,您可能会感到满意
foo ba* quux

为:

(?= .* \b foo            \b )
(?= .* \b ba[A-Za-z0-9]* \b )
(?= .* \b quux           \b )

这是一个简单的搜索和替换问题。但是要小心清理输入字符串,以通过删除标点等来避免注入攻击。

答案 6 :(得分:-1)

我认为你可能会用RegEx咆哮错误的树。 可能想要查看的是两个输入字符串的Levenshtein distance

有一个Javascript实现here和一个用法示例here