2012-02-28 152 views
1

我正在替換字符串中的單詞,並且我試圖根據'\b' + myword + '\b' 進行匹配但是,當myword兩端都有非單詞字符時,這不起作用。如何匹配包含非單詞字符的單詞?

var myword1 = "testword,"; 
var myword2 = "(testword"; 
var testString = "<tag>asdftestword, is a (testwordasdf also (testword </tag> (testword, should be replaced everywhere there is a testword,)"; 

var rx1 = new RegExp(???(myword1) ,'g'); 
var rx2 = new RegExp(???(myword2) ,'g'); 
var result1 = testString.replace(rx1, "replacement"); 
var result2 = testString.replace(rx2, "replacement"); 

我想結果是

result1 == "<tag>asdftestword, is a (testwordasdf also (testword </tag> (replacement should be replaced everywhere there is a replacement)" 
result2 == "<tag>asdftestword, is a (testwordasdf also replacement </tag> replacement, should be replaced everywhere there is a testword,)" 
+4

不能創建一個正則表達式這樣,不管哪個字符'myword'包含。看看[如何將變量傳遞到JavaScript中的正則表達式](http://stackoverflow.com/questions/8574498/how-to-pass-a-variable-into-an-regular-expression-in- JavaScript的)。 – 2012-02-28 22:33:19

+1

適用於所有標點符號,它們是\ b(字的開始/結尾)以外的字符。這很正常。 – inhan 2012-02-28 22:34:50

+0

@FelixKling感謝您的提示。 :) – 2012-02-29 16:44:08

回答

0

好的,我終於明白了這一點。它看起來太複雜了,我只需要一個RegExp就可以了!

看到它在行動Here

function EscapeRegex(text) { 
    if (!RegExp.sRE) { 
    var chars = '/.*+?|()[]{}\\'.split(''); 
    RegExp.sRE = new RegExp('\\'+chars.join('|\\'), 'g'); 
    } 
    return text.replace(RegExp.sRE, '\\$&'); 
} 

function ReplaceWholeWord(subjectString, wordtofind, replacement){ 
    var escapedWord = EscapeRegex(wordtofind); 
    //simplest scenaro, word to find has non-word characters at begining and end - do basic replace 
    if(regexIndexOf(escapedWord, '[^\\w]', 0) == 0 && regexLastIndexOf(escapedWord, '[^\\w]', 0) == wordtofind.length - 1){ 
     subjectString = subjectString.replace(new RegExp(escapedWord, 'g'), replacement); 
    } 
    //word to find begins with non-wordcharacter 
    else if(regexIndexOf(escapedWord, '[^\\w]', 0) == 0){ 
     var index = regexIndexOf(subjectString, escapedWord+'[^\\w]', index); 
     while(index > 0){ 
      subjectString = subjectString.substring(0, index) + replacement + subjectString.substring(index + wordtofind.length); 
      index = regexIndexOf(subjectString, escapedWord+'[^\\w]', index); 
     } 
    } 
    //word to find ends with non-wordcharacter 
    else if(regexLastIndexOf(escapedWord, '[^\\w]', 0) == wordtofind.length - 1){ 
     var index = regexIndexOf(subjectString, '[^\\w]'+escapedWord, index); 
     while(index > 0){ 
      subjectString = subjectString.substring(0, index) + replacement + subjectString.substring(index + myword.length + 1); 
      index = regexIndexOf(subjectString, escapedWord+'[^\\w]', index); 
     } 
    } 
    //word is normal 
    else{ 
     var index = regexIndexOf(subjectString,'[^\\w]'+escapedWord+'[^\\w]', index); 
     while(index >= 0){ 
      subjectString = subjectString.substring(0, index + 1) + replacement + subjectString.substring(index + wordtofind.length + 1); 
      index = regexIndexOf(subjectString,'[^\\w]'+escapedWord+'[^\\w]', index); 
     } 
    } 
    return subjectString; 
} 
0

你不需要正則表達式這一點。只需使用普通的字符串替換:

var myword = "testword,"; 
var testString = "<tag>asdftestword, is a testword</tag> (testword, should be replaced everywhere there is a testword,)"; 

var result = testString.replace(myword , "replacement"); 
+0

我需要它忽略' asdftestword,'http://jsfiddle.net/g4f8s/ yeilds' asdfreplacement是一個測試字(testword,應該隨處替換有一個測試字)' – 2012-02-28 22:39:03

+0

JavaScript的'String。 prototype.replace'只取代第一次出現;你必須使用帶'/ g'標誌的正則表達式來替換所有的事件。 (或者使用其他愚蠢的循環結構。) – Phrogz 2012-02-28 22:40:01

+0

使用正則表達式全局標誌'var result = testString.replace(/ testword,/ g,「replacement」); – deltree 2012-02-28 22:44:00

1
testString.replace(new RegExp('\\b'+myword+'\\b','g'), "replacement"); 

但是,如果myword可能包含在一個正則表達式的特殊字符(如括號,句號,支架等),那麼你就需要escape them first

RegExp.escape = function(text) { 
    if (!RegExp.sRE) { 
    var chars = '/.*+?|()[]{}\\'.split(''); 
    RegExp.sRE = new RegExp('\\'+chars.join('|\\'), 'g'); 
    } 
    return text.replace(RegExp.sRE, '\\$&'); 
} 

var re = new RegExp('\\b'+RegExp.escape(myword)+'\\b','g'); 
0
var rx = new RegExp('\\b' + myword ,'g'); 
var result = testString.replace(rx, 'replacement'); 
相關問題