2012-10-26 27 views
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)

+1

我想你的意思是'words.join'而不是'cities.join'? –

+0

所以你想要符合你的正則表達式的單詞返回'yourword(k)'和不匹配'yourotherword(s)'的單詞? –

+0

@MarkWalters是正是我想要的... – Rahul

回答

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; 

} 
+0

你在哪裏運行?它有'Array.indexOf'嗎?如果沒有,你必須以不同的方式檢查它。該行所做的就是檢查「match [0]」中的字符串是否包含在「words」中。你可以像循環一樣輕鬆地做到這一點。 – jrajav

+1

(我不瘋了,OP刪除了他的評論:P) – jrajav

0

像這樣的東西可能會g給你一個提示:

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)" 
+0

問題是如何處理無與倫比的單詞。 –

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)') 
    }) 
} 
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; 
} 
+0

返回'年輕女孩(s)跳躍(k)' –

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");

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/