2

我用这个作为关键字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)

4

6 回答 6

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;

}
于 2012-10-26T11:21:18.523 回答
1

您可以使用回调替换。

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

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

如果您不知道前面的单词集,您仍然可以即时生成正则表达式。假设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)')
  })
}
于 2012-10-26T11:23:47.297 回答
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)"

演示在这里

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

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

于 2012-10-26T12:06:50.907 回答
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)"
于 2012-10-26T11:21:55.780 回答
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;
}
于 2012-10-26T11:37:24.003 回答
0

您可以RegExp为此使用 a ,但是对于您正在做的事情 aRegExp是矫枉过正的。我会改用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/

于 2012-10-26T12:09:46.773 回答