1. 程式人生 > >js中的replace方法

js中的replace方法

本文主要研究字串方法中的replace方法,該方法主要用於將字串中符合匹配條件的字串替換成其他的字串,返回替換後的字串,且原字串不變。
語法:

	var newStr = str.replace(regexp|substr, newSubStr|function)
  1. 引數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是字串的情況。

  1. 引數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是函式
    該函式可能有以下幾個引數:
  1. 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引數可以有效的避免迴圈。

  2. 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

  3. offset:每次匹配得到的字串在源字串中的偏移量。(比如,如果原字串是“abcd”,匹配到的子字串是“bc”,那麼這個引數將是1)

  4. string: 被匹配的原字串。

總結:對於replace方法來說,如果引數1是字串或者是不帶全域性標誌g的正則表示式,那麼只進行一次匹配;如果引數1中帶有全域性標誌g,那麼會進行多次匹配,不管引數2是字串還是函式,都會進行多次替換(如果是函式的話是用函式的返回值進行多次替換);如果引數1中帶有捕獲組的話,那麼一般引數2如果是函式,那麼函式的p1,p2…等引數對應的就是1,2…等捕獲組捕獲到的子串,引數2如果是字串的話,$1,$2…等特殊變數對應的就是1,2…等捕獲組捕獲到的子串。

參考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace#使用字串作為引數