replace 替換全部的正確姿勢

2022-01-18 00:03:28 字數 2394 閱讀 2647

本文同步自我的個人部落格:

關於字串替換問題,其實是個很簡單的問題,但卻也不那麼簡單,至少對於很多新手而言,全域性替換一直是個坑。

可能你覺得要替換全域性,就改成正則,然後加個g全域性匹配就好了,例如:

var str = "test-test-test";

str = "test-test-test".replace("test", "ok");

console.log(str);

改成正則:

var str = "test-test-test";

str = "test-test-test".replace(/test/g, "ok");

console.log(str);

確實非常簡單,但是如果出現需要轉義的字元呢?

當然也難不倒大家,但是對於新手而言,正則就是一座無形的大山,完全無法越過。

例如表情標籤的替換呢?難道全部改成正則?那也要會正則的人花不少體力才能搞定吧。

今天群裡的朋友就遇到這麼個問題,表情標籤如下:

var faces = ;
當然我只是擷取了部分,好像有好幾十個,如果全部改成正則,需要不少體力呢。

這種情況,我們需要正常的字串替換,例如結合 while + indexof 實現。

var faces = ;

var str = "/::)-/::b-/::)-/:8-)-/:8-)";

for (var k in faces)

}console.log(str);

這樣,基本功能實現,不過這是有問題的,如果有乙個鍵值相同的,就會死迴圈例如:

var faces = ;

var str = "/::)-/::b-/:hehe-/:8-)-/:8-)";

for (var k in faces)

}console.log(str);

這樣,就呵呵了,當然不一定會有這樣的情況,但也不能肯定一定沒有這樣的情況。

我們需要用到 indexof 的第二個引數來規避這種情況,改進後的**如下:

var faces = ;

var str = "/::)-/::b-/:hehe-/:8-)-/:8-)";

for (var k in faces)

}console.log(str);

好了,現在這樣就沒問題了,也不用擔心死迴圈問題,而且替換大段文字的時候,效能比正則要好。 經過測試,確實正則快。

在大段正則匹配的時候,回溯會導致匹配效能問題,所以才一直認為正則慢,而這種情況的正則,不需要回溯,效能自然也極佳。

為了方便新手朋友使用,下面寫個函式吧。

/**

* 字串替換

* @param str 要被替換的字串

* @param substr 要替換的字串

* @param newstr 用於替換的字串

* @return 替換後的新字串

*/function replace(str, substr, newstr)

return str;

}console.log( replace("ssssss", "ss", "s") ); // sss

我發現,我也只能寫寫這些小東西,唉。。

在 4樓 antineutrino 的測試中得知,正則方法比 while + indexof 效能更佳。

之前一直認為正則就是慢的代名詞,所以直接忽略了正則方法,現在又重新認識了正則,正則果然犀利。

抽空寫了個正則版本的,把元字元種的幾個符號轉義下,就可以生成正則了。

網上那些正則版本中沒有轉義直接 new regexp 的會導致各種bug,所以要處理下元字元的那些符號。

/**

* 字串替換

* @param str 要被替換的字串

* @param substr 要替換的字串

* @param newstr 用於替換的字串

* @return 替換後的新字串

*/function replace(str, substr, newstr) ()|^$?*+]/g, "\\$&"); // 轉義字串中的元字元

var re = new regexp(substr, "g"); // 生成正則

return str.replace(re, newstr);

}console.log( replace("ssssss", "ss", "s") ); // sss

JS基礎篇 replace替換全部的正確應用

var str test test test str test test test replace test ok console.log str 使用正則 var str test test test str test test test replace test g,ok console.log...

JS中replace全部替換

今天遇到乙個問題,用replace只能替換乙個字元,不能替換字串中的全部字元,在網上找了很久也沒找到答案,有的說用 string.prototype.replaceall function findtext,reptext let regexp new regexp findtext,g retur...

replace未全域性替換的坑

今天是名副其實的週六。悠閒了一早上 太陽 真是人在家中坐,bug自天上來。哈哈其實也不是自天上來,還是自己之前埋下的雷。所以修復完線上的bug,我腦中立刻浮現出兩件還需要做的事情 一,就是我現在做的,趕緊記錄下來這個重要的時刻 二,就是我要去練練俯臥撐 笑哭 至於為啥呢,這就是懲罰嗯嗯 不囉嗦了。趕...