js中的replace方法
本文主要研究字串方法中的replace方法,該方法主要用於將字串中符合匹配條件的字串替換成其他的字串,返回替換後的字串,且原字串不變。
語法:
var newStr = str.replace(regexp|substr, newSubStr|function)
- 引數1:匹配條件:可以是正則表示式(regexp)或者字串(substr)
- 如果引數1是字串的話僅匹配一次。
var str = '#home#home' var pattern1= 'home' var newStr1 = str.replace(pattern1, 'home1') //得到newStr1的結果為"#home1#home"
- 如果引數1是正則表示式的話
先考慮沒有全域性標誌g和捕獲組的情況:
var str = '#home#home'
var pattern2= /home/
var newStr2 = str.replace(pattern2, 'home1') //得到newStr2的結果為"#home1#home"
即在沒有全域性標誌g和捕獲組的情況下,也是隻匹配一次。
如果在有全域性標誌g的情況下:
var str = '#home#home' var pattern3= /home/g var newStr3= str.replace(pattern3, 'home1') //得到newStr3的結果為"#home1#home1"
即在有全域性標誌g的情況下可以實現全域性多次匹配。
如果在有捕獲組的情況下:
var str = "John Smith";
var pattern4 = /(\w+)\s(\w+)/;
var newStr4= str.replace(pattern4, 'zyp') //得到newStr4的結果為"zyp"
即針對引數1pattern是捕獲組的情況,引數2是字串,那麼該字串替換第一個捕獲組,其餘的捕獲組被空字串替換,所以當引數1pattern中存在捕獲組的情況下,引數2一般是一個函式或者特殊變數名(下面將要講到)。
以上考慮的都是引數2是字串的情況。
- 引數2:可以是替換字串( newSubStr)或者是方法(function)
- 如果引數2是替換字串
上面針對引數1的幾個例子都是引數2是字串的情況,還有一種需要注意的情況是:引數2的字串中可以插入以下特殊的變數名:
$$ :插入一個 “$”。
$& :插入匹配的子串。
$` :插入當前匹配的子串左邊的內容。
$’ :插入當前匹配的子串右邊的內容。
$n :假如第一個引數是 RegExp物件,並且 n 是個小於100的非負整數,那麼插入第 n 個括號匹配的字串。索引是從1開始。
最常見的特殊變數名是 $n:
var str = "John Smith";
var pattern5 = /(\w+)\s(\w+)/;
var newStr5= str.replace(pattern5, '$2 $1') //得到newStr5的結果為"Smith John"
- 如果引數2是函式
該函式可能有以下幾個引數:
-
match: 每次匹配得到的字串。如果正則表示式中含有全域性標誌g的話,那麼函式每次匹配到結果函式都會執行一次,即函式會執行多次,每次匹配得到的字串就是match。
針對引數match來說,以下例子可以進行說明:
function styleHyphenFormat(propertyName) { function upperToHyphenLower(match) { return '-' + match.toLowerCase(); } return propertyName.replace(/[A-Z]/g, upperToHyphenLower); } var styleFormat = styleHyphenFormat('borderLeftWidth') // styleFormat的結果是"border-left-width"
上述例子應該即是jquery的css函式中的實現,巧用match引數可以有效的避免迴圈。
-
p1, p2…: 捕獲組匹配到的字串。如果正則表示式中含有捕獲組的話,
針對p1,p2…等引數來說,以下例子可以進行說明:function replacer(match, p1, p2, p3, offset, string) { console.log(match) return [p1, p2, p3].join(' - '); } var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer); // newString的結果是 abc - 12345 - #$*%
注意上述例子中的match打印出來的結果是‘abc12345#$*%’,即如果pattern中沒有全域性標誌g的話,match引數得到的就是match方法中引數1pattern中包含捕獲組情況下得到的陣列的第一個元素,關於match方法的介紹,可以參見我的另外一篇部落格字串搜尋匹配之match&&exec。
-
offset:每次匹配得到的字串在源字串中的偏移量。(比如,如果原字串是“abcd”,匹配到的子字串是“bc”,那麼這個引數將是1)
-
string: 被匹配的原字串。
總結:對於replace方法來說,如果引數1是字串或者是不帶全域性標誌g的正則表示式,那麼只進行一次匹配;如果引數1中帶有全域性標誌g,那麼會進行多次匹配,不管引數2是字串還是函式,都會進行多次替換(如果是函式的話是用函式的返回值進行多次替換);如果引數1中帶有捕獲組的話,那麼一般引數2如果是函式,那麼函式的p1,p2…等引數對應的就是1,2…等捕獲組捕獲到的子串,引數2如果是字串的話,$1,$2…等特殊變數對應的就是1,2…等捕獲組捕獲到的子串。