我想在字符串中找到给定字符串的所有匹配项(除以空格)。 (例如,iTunes搜索框的工作方式)。
例如,“ ab de ”和“ de ab ”将在“ abcde ”(也是“< em> bc ea “或任何订单应该返回true”
如果我用外卡替换空格,“ab * de”将在“ abcde ”上返回true,而不是“de * ab”。 [我只使用*而不是Regex语法来解释]
我找不到任何纯正的Regex解决方案。 我能想到的唯一解决方案是拆分搜索词并运行多个正则表达式。
是否有可能找到一个涵盖所有这些选项的纯正Regex表达式?
答案 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)
将匹配包含bc
,e
,和 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。