我想在javascript中实现与文本中的一个或多个关键字匹配的正则表达式匹配函数。每个关键字都必须以任何顺序找到。关键字由用户输入。
我在这里:
\b(smart.*\bwork.*|work.*\bsmart.*)
"trying to work smarter"
"trying to work" or "trying to be smart"
这种方法的问题是我必须创建关键字集的不同有序排列(无论如何)。
所以问题是:
"\b(smart.*|work.*)<magic:all,anyorder>"
什么将确保找到所有关键字,并以任何顺序)[1,2,3]
生成[[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]
)更新
这用于在客户端(在浏览器中)搜索一组字符串(10-50个字符串)。
答案 0 :(得分:5)
除非用户正在寻找可能出现在较大单词中的小词,否则我的朋友Juan的答案将会很好。在这种情况下,您需要回退到正则表达式。您可以使用仅在找到字符串时使用RE的混合方法。类似的东西:
String.prototype.containsAll = function(){
for (var i=0; i < arguments.length; i++) {
if (this.indexOf( arguments[i] ) > -1 ) {
// test with regular expressions
var re = new RegExp('\\b' + escapeRe(arguments[i]) + '\\b')
if (!re.test(this)) {
return false;
}
} else {
return false
}
}
return true;
function escapeRe(re) {
return re.replace(/[$.*+?()\[\]\\^]/g, function(chr) {
return '\\' + chr;
});
}
}
从未测试过,尤其不是escapeRe位。
答案 1 :(得分:1)
仅仅因为BeemerGuy没有将其作为答案发布。但他有信心。没有一个RegEx可以做你想要的,创建一个使用indexOf的方法要简单得多。我的性能测试表明,如果可能的话,你应该总是更喜欢indexOf而不是RegEx。
function containsAll(searchString /*, word, word,...*/) {
for (var i=1; i < arguments.length; i++) {
if (searchString.indexOf( arguments[i] ) == -1 ) {
return false;
}
}
return true;
}
或者如果你不介意修改String.prototype
String.prototype.containsAll = function(){
for (var i=0; i < arguments.length; i++) {
if (this.indexOf( arguments[i] ) == -1 ) {
return false;
}
}
return true;
}