JavaScript中replace()方法的第二個參數解析

語法

string.replace(searchvalue,newvalue)正則表達式

 

參數值

searchvalue
必須。規定子字符串或要替換的模式的 RegExp 對象。請注意,若是該值是一個字符串,則將它做爲要檢索的直接量文本模式,而不是首先被轉換爲 RegExp 對象。數組

newvalue
必需。一個字符串值。規定了替換文本或生成替換文本的函數。函數

 

返回值

String
一個新的字符串,是用 replacement 替換了 regexp 的第一次匹配或全部匹配以後獲得的。spa

 

第一個參數searchvalue

這個參數比較好理解,要麼是字符串要麼是正則表達式。上文說的「請注意,若是該值是一個字符串,則將它做爲要檢索的直接量文本模式,而不是首先被轉換爲 RegExp 對象。」,意思是'/abc/gi'不會被解析爲正則對象,即便它跟正則寫法同樣。code

本文不說第一個參數,只說第二個參數。regexp

 

第二個參數newvalue

這個參數要麼是普通字符串,要麼是正則替換表達式字符串,說來講去都是字符串,要麼是一個函數。對象

正則替換表達式

特殊替換字符:blog

字符 替換文本
$& 與正則相匹配的字符串
$` 匹配字符串左邊的字符
$’ 匹配字符串右邊的字符
$1,$2,$,3,…,$n 匹配結果中對應的分組匹配結果索引

 

$&

$& 適用於沒有子表達式的狀況字符串

var sStr='討論一下正則表達式中的replace的用法';
sStr.replace(/正則表達式/,'《$&》');
// 獲得:"討論一下《正則表達式》中的replace的用法"

 

$`

匹配字符串左邊的全部字符

var sStr='討論一下正則表達式中的replace的用法';
sStr.replace(/正則表達式/,'《$`》');
// 獲得:"討論一下《討論一下》中的replace的用法"

 

$'

匹配字符串右邊的全部字符,注意,既然 $' 有單引號,那麼外面的引號必須雙引號,若是不能夠雙引號,只能把 $' 的單引號轉義。

var sStr='討論一下正則表達式中的replace的用法';
sStr.replace(/正則表達式/,"《$'》");
// 獲得:"討論一下《中的replace的用法》中的replace的用法"

 

$1, $2, $3, …, $n

依次匹配子表達式

var sStr='討論一下正則表達式中的replace的用法';
sStr.replace(/(正則)(.+?)(式)/,"《$1》$2<$3>");
// 獲得:"討論一下《正則》表達<式>中的replace的用法"

 

函數

先看arguments的用法:

var sStr='討論一下正則表達式中的replace的用法';
sStr.replace(/(正則).+?(式)/,function() {
    console.log(arguments);
});
// ["正則表達式", "正則", "式", 4, "討論一下正則表達式中的replace的用法"]

 

參數分別爲:

  • 匹配到的字符串(此例爲"正則表達式")

  • 若是正則使用了分組匹配就爲多個不然無此參數。(此例的參數就分別爲 "正則", "式")

  • 匹配字符串的對應索引位置(也就是"正則表達式"的索引位置,此例爲4)

  • 原始字符串

 

若是加上全局標識符g,則是:

var sStr='討論一下正則表達式中的replace的正則表達式用法';
sStr.replace(/(正則).+?(式)/g,function() {
    console.log(arguments);
});
// ["正則表達式", "正則", "式", 4, "討論一下正則表達式中的replace的正則表達式用法"]
// ["正則表達式", "正則", "式", 19, "討論一下正則表達式中的replace的正則表達式用法"]

 

也就是說,arguments是當前函數的內置屬性,指代當前匹配的參數僞數組。arguments[0]就是當前匹配的字符串。

var sStr='討論一下正則表達式中的replace的正則表達式用法';
sStr.replace(/(正則).+?(式)/g,function() {
    console.log(arguments[0]);
    return arguments[0] + 'a';
});
// 正則表達式
// 正則表達式
// "討論一下正則表達式a中的replace的正則表達式a用法"

函數作參數的優點,在於能夠對arguments作更復雜的操做,而不像只是一個字符串參數那麼簡陋。固然,arguments不是必須用,能夠不用。

 

原文連接: https://www.jianshu.com/p/31bebd90fd1d

相關文章
相關標籤/搜索