2012-02-28 105 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'); 
相关问题