如何获得无与伦比的关键字?

时间:2012-10-26 11:11:20

标签: javascript jquery keyword-search

我将其用作关键字s='young girl jumping'

function selfreplace(s) {
    var words = ['man', 'jumping'];
    var re = new RegExp('\\b(' + words.join('|') + ')\\b', 'g');
    var specials = [];
    var match;
    var str = "";
    while(match = re.exec(s)) {
        str += match[0] + '(k)';
    }
    return str;
}

它正在返回jumping(k)

我希望结果为young(s) girl(s) jumping(k)

6 个答案:

答案 0 :(得分:1)

最简单的方法是检查它是否在正则表达式之外的words中:

function selfreplace(s) {
   var words = ['man','jumping'];
   var re = new RegExp('\\b(\\w+)\\b', 'g');   
   var specials = [];
   var match;
   var str = "";
   while(match = re.exec(s))
   {
       if (words.indexOf(match[0]) !== -1))
           str += match[0] + '(k)';
       else
           str += match[0] + '(s)';
   }    
   return str;

}

答案 1 :(得分:1)

您可以使用替换回调。

function selfreplace(s){
  return s.replace(/man|jumping|(\w+)/g, function(word, misc){
    return word + (misc? '(s)' : '(k)')
  })
}

如果匹配的单词是manjumping,则只设置第一个参数(整个匹配)。如果匹配的单词是任何其他单词,则也会设置第一个捕获组。

如果你不知道前面的单词集,你仍然可以动态生成正则表达式。假设words不包含非单词字符:

function selfreplace(s, words){ //or any other method of passing 'words'
  var re = RegExp(words.join("|")+"|(\\w+)",'g');
  return s.replace(re, function(word, misc){
    return word + (misc? '(s)' : '(k)')
  })
}

答案 2 :(得分:1)

只是一种不同的方法,可能不是最好的解决方案,但我想我会把它扔出去。

var str = "young girl jumping";

function replaceStr(s){

    var matched = new RegExp("man|jumping", "i");
    var newStr = "";
    var str = s.split(" ");
    for(var i=0; i<str.length;i++){
        if(str[i].match(matched)){
            newStr += str[i]+"(k) ";
        } else {
            newStr += str[i]+"(s) ";
        }
    }
    return newStr.substr(0, newStr.length-1); 
}

//replaceStr(str) returns "young(s) girl(s) jumping(k)"

DEMO此处

如果匹配的单词可能会改变,那么您可以随时修改此函数,使其接受数组作为第二个参数,然后动态创建正则表达式

replaceStr(s, matchArr){}var matched = new RegExp("("+matchArr.join("|")+")", "i");

答案 3 :(得分:0)

这样的事情可能会给你一个提示:

var s = "young girl jumping",
    words = ['man','jumping'],
    regex = new RegExp("(" + words.join("|") +")", "g"),
    q = s.replace(regex, function( string ) {
        return string + "(k)";
    });

console.log(q); // "young girl jumping(k)"

答案 4 :(得分:0)

如果你只匹配单词,你根本不需要正则表达式,是吗?

用==

查找单词怎么样?
function selfreplace(s) {
    var words = ['man','jumping'];
    var input = s.split(" ");
    var str = "";
    for(var i=0; i<input.length; i++){
        var tmpString = "(s)";
        for(var j=0; j<words.length; j++){
            if(input[i] == words[j]){
                tmpString = "(k)";
            }
        }
        str += input[i]+tmpString;
    }
    return str;
}

答案 5 :(得分:0)

你可以使用RegExp,但对于你正在做的事情,RegExp是过度的。我会改用Array方法:

var selfreplace = function selfreplace(s) {
    var words = ['man', 'jumping'],
        i = 0,
        suffix = '(s)';
    s = s.split(' ');
    for (i = 0; i < s.length; i += 1) {
        if (words.indexOf(s[i]) > -1) {
            s[i] = s[i] + '(k)';
        } else {
            s[i] = s[i] + '(s)';
        }
    }
    return s.join(' ');
};

这是一个小提琴:http://jsfiddle.net/4KAzw/