自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在 JavaScript 中替換所有指定字符 3 種方法

開發(fā) 前端
在 JS 最新的提案String.prototype.replaceAll() 中,它將replaceAll()方法用于字符串。在該提案還沒出來之前,我們來看看在 JS 中有哪些方法可以實(shí)現(xiàn) reaplceAll 的效果。

本文轉(zhuǎn)載自微信公眾號(hào)「大遷世界」,轉(zhuǎn)載本文請(qǐng)聯(lián)系大遷世界公眾號(hào)。

在 JS 沒有提供一種簡(jiǎn)便的方法來替換所有指定字符。 在 Java 中有一個(gè) replaceAll() ,replaceAll(String regex, String replacement))方法使用給定的參數(shù) replacement 替換字符串所有匹配給定的正則表達(dá)式的子字符串。

在 JS 最新的提案String.prototype.replaceAll() 中,它將replaceAll()方法用于字符串。

在該提案還沒出來之前,我們來看看在 JS 中有哪些方法可以實(shí)現(xiàn) reaplceAll 的效果。

第一種:使用 split 和 join 的方法

這種方法,主要包含二個(gè)階段:

  • 使用 split 方法,根據(jù)指定的字符將字符串分成多個(gè)部分。
  • 然后使用 join 方法將分割的多個(gè)部分連接在一直,并在它們之間插入指定的字符。

例如,我們將字符串'1+2+3'中的+替換為-。首先,通過split方法根據(jù) +分割符將'1+2+3'分開,得到['1','2','3']。然后通過 join 方法并指定連接字條-,得到結(jié)果'1-2-3'。示例如下:

  1. const search = 'duck'
  2. const replaceWith = 'goose'
  3.  
  4. const result = 'duck duck go'.split(search).join(replaceWith); 
  5.  
  6. result; // => 'goose goose go' 

'duck duck go'.split('duck')將字符串分割成幾段:['', ' ', ' go']。['', ' ', ' go'].join('goose') 在元素之間插入'goose'并連接起來,得到'goose goose go'。

最后我們把這種方式封裝成一個(gè)幫助函數(shù) replaceAll:

  1. function replaceAll(string, search, replace) { 
  2.   return string.split(search).join(replace); 
  3.  
  4. replaceAll('abba', 'a', 'i');          // => 'ibbi' 
  5. replaceAll('go go go!', 'go', 'move'); // => 'move move move!' 
  6. replaceAll('oops', 'z', 'y');          // => 'oops' 

這種方法需要將字符串轉(zhuǎn)換為數(shù)組,然后再轉(zhuǎn)換回字符串。這是一種變通方法,但不是一個(gè)好的解決方案。

2. 使用全局正則表達(dá)式replace()

String.prototype。replace(regExp, replaceWith)搜索正則表達(dá)式regExp出現(xiàn)的情況,然后使用replaceWith字符串替換所有匹配項(xiàng)。

必須啟用正則表達(dá)式上的全局標(biāo)志,才能使replace()方法替換模式出現(xiàn)的所有內(nèi)容,我們可以這樣做:

  • 在正則表達(dá)式文字中,將g附加到標(biāo)志部分:/search/g。
  • 對(duì)于正則表達(dá)式構(gòu)造函數(shù),使用 flags 參數(shù):new RegExp('search', 'g')

我們把所有的duck換成goose:

  1. const searchRegExp = /duck/g 
  2. const replaceWith = 'goose' 
  3.  
  4. const result = 'duck duck go'.replace(searchRegExp, replaceWith) 
  5.  
  6. result // 'goose goose go' 

正則表達(dá)式文字/duck/g與'duck'字符串匹配,并且啟用了全局模式。

'duck duck go'.replace(/duck/g, 'goose')用'goose'替換所有匹配/duck/g字符串。

通過向正則表達(dá)式添加i標(biāo)志,可以忽略大小寫:

  1. const searchRegExp = /duck/gi; 
  2. const replaceWith = 'goose'
  3.  
  4. const result = 'DUCK duck go'.replace(searchRegExp, replaceWith); 
  5.  
  6. result; // => 'goose goose go' 

再次查看正則表達(dá)式:/duck/gi。 正則表達(dá)式啟用了不區(qū)分大小寫的搜索:i和全局標(biāo)志g。 /duck/gi匹配'duck',以及'DUCK','Duck'等。

'DUCK duck go'.replace(/duck/gi, 'goose')以不區(qū)分大小寫的方式用'goose'替換了/duck/gi`所匹配到的結(jié)果。

雖然正則表達(dá)式替換了所有出現(xiàn)的字符串,但在我看來,這種方法過于繁瑣。

(1) 字符串中的正則表達(dá)式

當(dāng)在運(yùn)行時(shí)確定搜索字符串時(shí),使用正則表達(dá)式方法不方便。 從字符串創(chuàng)建正則表達(dá)式時(shí),必須轉(zhuǎn)義字符-[] / {}()* +? 。 \ ^ $ |,示例如下:

  1. const search = '+' 
  2.  
  3. const searchRegExp = new RegExp(search, 'g') // // 拋出 SyntaxError 異常 
  4. const replaceWith = '-' 
  5.  
  6. const result = '5+2+1',replace(searchRegExp, replaceWith ) 

上面的代碼片段嘗試將搜索字符串'+'轉(zhuǎn)換為正則表達(dá)式。 但是'+'是無效的正則表達(dá)式,因此會(huì)引發(fā)SyntaxError: Invalid regular expression: /+/異常。

(2) 字符串的 replace() 方法

如果replace(search, replaceWith)的第一個(gè)參數(shù)是字符串,那么該方法只替換search的第一個(gè)結(jié)果。

  1. const search = 'duck'
  2. const replaceWith = 'goose'
  3.  
  4. const result = 'duck duck go'.replace(search, replaceWith); 
  5.  
  6. result; // => 'goose duck go' 

'duck duck go'.replace('duck','goose')僅將'duck'的首次出現(xiàn)替換為'goose'。

3. replaceAll() 方法

最后,新的提案

String.prototype.replaceAll()(在第3階段)將replaceAll()方法引入到 JavaScript 的字符串中。

replaceAll(search, replaceWith)字符串方法用replaceWith替換所有的search字符串,沒有任何變通方法。

我們把所有的duck換成goose:

  1. const search = 'duck' 
  2. const replaceWith = 'goose'
  3.  
  4. const result = 'duck duck go'.replaceAll(search, replaceWith); 
  5.  
  6. result; // => 'goose goose go' 

'duck duck go'.replaceAll('duck', 'goose')將所有出現(xiàn)的'duck'字符串替換為'goose',這是簡(jiǎn)單明了的解決方案。

(1) replaceAll()與replace()的區(qū)別

字符串方法replaceAll(search, replaceWith)和replace(search, replaceWith)的行為方式是一樣的,除了兩件事:

  • 如果search參數(shù)是一個(gè)字符串,那么replaceAll()用replaceWith替換所有出現(xiàn)的search,而replace()只替換第一次出現(xiàn)的search。
  • 如果search參數(shù)是一個(gè)非全局正則表達(dá)式,那么replaceAll()將拋出一個(gè)TypeError 異常。

4. 總結(jié)

替換所有出現(xiàn)的字符串應(yīng)該很容易。 但是,JavaScript 很久一段時(shí)間沒有提供這種方法。

一種方法是通過搜索字符串將字符串拆分為多個(gè)塊,將字符串重新連接,然后在塊之間放置替換字符串:string.split(search).join(replaceWith)。 這種方法有效,但是很麻煩。

另一種方法是將String.prototype.replace()與啟用了全局搜索的正則表達(dá)式一起使用:string.replace(/SEARCH/g, replaceWith)。

不幸的是,由于必須轉(zhuǎn)義正則表達(dá)式的特殊字符,因此在運(yùn)行時(shí)無法輕松地從字符串生成正則表達(dá)式。 處理正則表達(dá)式以簡(jiǎn)單地替換字符串的方法非常麻煩。

最后

String.prototype.replaceAll()方法可以輕松地直接替換所有出現(xiàn)的字符串:string.replaceAll(search, replaceWith)。 這是第3階段的提案,但希望很快就會(huì)納入新的JavaScript標(biāo)準(zhǔn)。

我的建議是使用replaceAll()來替換字符串。但你需要一個(gè)polyfill來使用這個(gè)方法。

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2020-10-16 18:35:53

JavaScript字符串正則表達(dá)式

2021-11-11 14:50:01

JavaScriptarry編程開發(fā)

2020-08-01 16:19:13

JavaScript字符串開發(fā)

2018-12-19 19:30:46

JavaScript創(chuàng)建對(duì)象前端

2009-10-12 10:33:11

Javascript替

2024-08-29 08:04:14

2010-11-22 12:04:09

MySQL字段

2018-08-02 09:50:47

Linux命令用戶信息

2021-11-05 21:36:59

JavaScript語言開發(fā)

2010-07-14 16:37:33

SQL Server拆

2021-05-28 08:23:03

JavaScriptSet編程

2010-06-03 08:55:43

LINQ

2019-06-04 11:17:39

Windows Linux命令

2020-09-03 10:13:49

JavaScript字符串pad

2020-12-26 14:48:21

UbuntuLinuxDeb文件

2010-11-26 10:29:21

MySQL批量替換

2020-12-14 10:50:13

Linux命令文件

2020-06-18 10:26:43

JavaScript開發(fā)技術(shù)

2020-09-19 18:03:42

Docker

2022-05-31 16:00:46

Go 編程語言復(fù)制文件Go 標(biāo)準(zhǔn)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)