正则表达式关键字匹配

时间:2010-12-17 00:26:33

标签: javascript regex pattern-matching

我想在javascript中实现与文本中的一个或多个关键字匹配的正则表达式匹配函数。每个关键字都必须以任何顺序找到。关键字由用户输入。

我在这里:

\b(smart.*\bwork.*|work.*\bsmart.*)
  • 匹配"trying to work smarter"
  • 但不是"trying to work" or "trying to be smart"

这种方法的问题是我必须创建关键字集的不同有序排列(无论如何)。

所以问题是:

  1. 如果只有简单的RegEx方式? (即"\b(smart.*|work.*)<magic:all,anyorder>"什么将确保找到所有关键字,并以任何顺序)
  2. 如果没有 - 你能否建议一个javascript实现的数组排列(以便从[1,2,3]生成[[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]
  3. 更新

    这用于在客户端(在浏览器中)搜索一组字符串(10-50个字符串)。

2 个答案:

答案 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;
}
相关问题