如何在JavaScript中替換所有出現的字符串?


Answers

str = str.replace(/abc/g, '');

回應評論:

var find = 'abc';
var re = new RegExp(find, 'g');

str = str.replace(re, '');

為了回應Click Upvote的評論,你可以更簡化它:

function replaceAll(str, find, replace) {
    return str.replace(new RegExp(find, 'g'), replace);
}

注:正則表達式包含特殊(meta)字符,因此在上面的find函數中盲目地傳遞一個參數而不預先處理它來轉義這些字符是危險的。 這在Mozilla開發者網絡正則表達式JavaScript指南中有介紹 ,它們提供了以下的實用功能:

function escapeRegExp(str) {
    return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}

因此,為了使上面的replaceAll()函數更安全,如果還包含escapeRegExp ,可以將其修改為以下escapeRegExp

function replaceAll(str, find, replace) {
    return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}
Question

我有這個字符串:

"Test abc test test abc test test test abc test test abc"

str = str.replace('abc', '');

似乎只能刪除上面字符串中第一次出現的abc 。 我怎樣才能取代所有的事件呢?




使用g標誌設置的正則表達式將取代所有:

someString = 'the cat looks like a cat';
anotherString = someString.replace(/cat/g, 'dog');
// anotherString now contains "the dog looks like a dog"

也看到這裡




更新:

更新有些晚了,但是因為我偶然發現了這個問題,並且注意到我之前的回答並不是我所滿意的。 由於問題涉及替換一個單詞,這是令人難以置信的,沒有人想到使用單詞邊界( \b

'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"

這是一個簡單的正則表達式,避免在大多數情況下替換單詞的部分。 然而,短劃線-仍然被認為是一個字的邊界。 所以在這種情況下可以使用條件來避免替換像cool-cat這樣的字符串:

'a cat is not a cool-cat'.replace(/\bcat\b/gi,'dog');//wrong
//"a dog is not a cool-dog" -- nips
'a cat is not a cool-cat'.replace(/(?:\b([^-]))cat(?:\b([^-]))/gi,'$1dog$2');
//"a dog is not a cool-cat"

基本上,這個問題和這裡的問題是一樣的: Javascript用“”替換“”“

@邁克,檢查我給了那裡的答案...正則表達式是不是唯一的方法來取代多次出現,子離子,遠離它。 靈活思考,思考分裂!

var newText = "the cat looks like a cat".split('cat').join('dog');

或者,為了防止替換字的部分,也就是批准的答案。 你可以用正則表達式來解決這個問題,我承認,這個表達式有點複雜,作為一個結果,稍微慢一些:

var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");

輸出與接受的答案相同,但是,在此字符串上使用/ cat / g表達式:

var oops = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/cat/g,'dog');
//returns "the dog looks like a dog, not a dogerpillar or cooldog" ?? 

糟糕,這可能不是你想要的。 那麼是什麼? 恕我直言,只是有條件地取代'貓'的正則表達式。 (即不是一個單詞的一部分),如下所示:

var caterpillar = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
//return "the dog looks like a dog, not a caterpillar or coolcat"

我的猜測是,這符合你的需求。 當然,這不是全面的,但它應該足以讓你開始。 我建議閱讀更多的這些網頁。 這將有助於完善這個表達式來滿足您的特定需求。

http://www.javascriptkit.com/jsref/regexp.shtml

http://www.regular-expressions.info

最後加入:

鑑於這個問題仍然有很多觀點,我想我可能會添加一個.replace用於回調函數的例子。 在這種情況下,它極大地簡化了表達式, 提供了更大的靈活性,例如用正確的大小寫替換或一次性替換catcats

'Two cats are not 1 Cat! They\'re just cool-cats, you caterpillar'
   .replace(/(^|.\b)(cat)(s?\b.|$)/gi,function(all,char1,cat,char2)
    {
       //check 1st, capitalize if required
       var replacement = (cat.charAt(0) === 'C' ? 'D' : 'd') + 'og';
       if (char1 === ' ' && char2 === 's')
       {//replace plurals, too
           cat = replacement + 's';
       }
       else
       {//do not replace if dashes are matched
           cat = char1 === '-' || char2 === '-' ? cat : replacement;
       }
       return char1 + cat + char2;//return replacement string
    });
//returns:
//Two dogs are not 1 Dog! They're just cool-cats, you caterpillar



str = str.replace(/abc/g, '');

或者從這裡嘗試replaceAll函數:

什麼是擴展內置對象的有用的JavaScript方法?

str = str.replaceAll('abc', ''); OR

var search = 'abc';
str = str.replaceAll(search, '');

編輯:澄清關於replaceAll可用性

'replaceAll'方法被添加到String的原型。 這意味著它將可用於所有字符串對象/文字。

例如

var output = "test this".replaceAll('this', 'that');  //output is 'test that'.
output = output.replaceAll('that', 'this'); //output is 'test this'



這是不使用正則表達式最快版本。

修正了jsperf

replaceAll = function(string, omit, place, prevstring) {
  if (prevstring && string === prevstring)
    return string;
  prevstring = string.replace(omit, place);
  return replaceAll(prevstring, omit, place, string)
}

它幾乎是分割和連接方法的兩倍

正如在這裡的評論中指出的那樣,如果你的omit變量包含place ,那麼這將不起作用,如: replaceAll("string", "s", "ss") ,因為它總是能夠替換另一個字。

還有另一個與我的遞歸替換jsperf變得更快( http://jsperf.com/replace-all-vs-split-join/12 )!

  • 2017年7月27日更新:看起來RegExp現在在最近發布的Chrome 59中表現最快。



假設你想用'x'代替所有'abc':

let some_str = 'abc def def lom abc abc def'.split('abc').join('x')
console.log(some_str) //x def def lom x x def

我試圖想想比修改字符串原型更簡單的事情。




function replaceAll(str, find, replace) {
  var i = str.indexOf(find);
  if (i > -1){
    str = str.replace(find, replace); 
    i = i + replace.length;
    var st2 = str.substring(i);
    if(st2.indexOf(find) > -1){
      str = str.substring(0,i) + replaceAll(st2, find, replace);
    }       
  }
  return str;
}



如果你想找到的東西已經在一個字符串中,而且你沒有一個正則表達式,你可以使用join / split:

function replaceMulti(haystack, needle, replacement)
{
    return haystack.split(needle).join(replacement);
}

someString = 'the cat looks like a cat';
anotherString = replaceMulti(someString, 'cat', 'dog');



while (str.indexOf('abc') !== -1)
{
    str = str.replace('abc', '');
}



你可以簡單地使用下面的方法

/**
 * Replace all the occerencess of $find by $replace in $originalString
 * @param  {originalString} input - Raw string.
 * @param  {find} input - Target key word or regex that need to be replaced.
 * @param  {replace} input - Replacement key word
 * @return {String}       Output string
 */
function replaceAll(originalString, find, replace) {
  return originalString.replace(new RegExp(find, 'g'), replace);
};



只需添加/g

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

// Replace 'hello' string with /hello/g regular expression.
document.body.innerHTML = document.body.innerHTML.replace(/hello/g, 'hi');

/g意味著全球




我的實現,非常自我解釋

function replaceAll(string, token, newtoken) {
    if(token!=newtoken)
    while(string.indexOf(token) > -1) {
        string = string.replace(token, newtoken);
    }
    return string;
}



大多數人可能會這樣做的URL編碼。 要對URL進行編碼,您不僅應該考慮​​空格,還應該使用encodeURI正確地轉換整個字符串。

encodeURI("http://www.google.com/a file with spaces.html")

要得到:

http://www.google.com/a%20file%20with%20spaces.html



為了替換所有類型的字符,請嘗試下面的代碼:

Suppose we have need to send " and \ in my string, then we will convert it " to \" and \ to \\

所以這個方法將解決這個問題。

String.prototype.replaceAll = function (find, replace) {
     var str = this;
     return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
 };

var message = $('#message').val();
             message = message.replaceAll('\\', '\\\\'); /*it will replace \ to \\ */
             message = message.replaceAll('"', '\\"');   /*it will replace " to \\"*/

我使用的是Ajax,而且我需要以JSON格式發送參數。 那麼我的方法是這樣的:

 function sendMessage(source, messageID, toProfileID, userProfileID) {

     if (validateTextBox()) {
         var message = $('#message').val();
         message = message.replaceAll('\\', '\\\\');
         message = message.replaceAll('"', '\\"');
         $.ajax({
             type: "POST",
             async: "false",
             contentType: "application/json; charset=utf-8",
             url: "services/WebService1.asmx/SendMessage",
             data: '{"source":"' + source + '","messageID":"' + messageID + '","toProfileID":"' + toProfileID + '","userProfileID":"' + userProfileID + '","message":"' + message + '"}',
             dataType: "json",
             success: function (data) {
                 loadMessageAfterSend(toProfileID, userProfileID);
                 $("#<%=PanelMessageDelete.ClientID%>").hide();
                 $("#message").val("");
                 $("#delMessageContainer").show();
                 $("#msgPanel").show();
             },
             error: function (result) {
                 alert("message sending failed");
             }
         });
     }
     else {
         alert("Please type message in message box.");
         $("#message").focus();

     }
 }

 String.prototype.replaceAll = function (find, replace) {
     var str = this;
     return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
 };



function replaceAll(str, find, replace) {
    var $r="";
    while($r!=str){ 
        $r = str;
        str = str.replace(find, replace);
    }
    return str;
}