當replace() 方法的第二個參數 replacement是函數而不是字符串時,每次匹配都調用該函數,將這個函數的返回的字符串將作為替換文本使用。這個函數是自定義的替換規則。
當第二個參數是函數時,這個函數的前三個參數():
1、當正則沒有分組的時候,傳進去的第一個實參是正則捕獲到的內容,第二個參數是捕獲到的內容在原字符串中的索引位置,第三個參數是原字符串(輸入字符串)
2、當正則有分組的時候,第一個參數是總正則查找到的內容,后面依次是各個子正則查找到的內容。
2、傳完查找到的內容之后,再把總正則查找到的內容在原字符串中的索引傳進(就是arguments[0]在str中的索引位置)。最后把輸入字符串(就是原字符串)傳進去
示例1:
要求:找到字符串中的小寫字母,給它在后邊加上小括號來注明它在str字符串中的位置。比如str中的第一個a,它出現在str字符串的第一個索引位置中,則a變成a(1)。下面的str最終得到的結果是Xa(1)ZZc(4)Ud(6)Fe(8)
var str="XaZZcUdFe"; var reg=/[a-z]/g;//注意:全文替換必須加g str=str.replace(reg,function(){ return arguments[0]+"("+arguments[1]+")"; //arguments.length的值是3,在reg沒有分組的情況下length屬性肯定是3. //其中arguments[0]是正則捕獲查找到的內容;arguments[1]是正則查找到的內容在str這個字符串中的索引位置;arguments[2]是str字符串本身(叫輸入字符串) //這個匿名函數被自動執行四次,每一次arguments里的值分別是: //第一次:arguments[0]是a,arguments[1]是1,arguments[2]是原字符str本身 //第二次:arguments[0]是c,arguments[1]是4,arguments[2]是原字符str本身 //第三次:arguments[0]是,arguments[1]是6,arguments[2]是原字符str本身 //第四次:arguments[0]是e,arguments[1]是8,arguments[2]是原字符str本身 }) alert(str);//彈出 Xa(1)ZZc(4)Ud(6)Fe(8)
示例2:
要求:找出下面字符串中兩個連着出現的數字,用它們的和將它們替換。
比如第一次找到4和5,用9替換,第二次找到的是8和9,用17替換,第三次找到的是7和2,用9替換,最終生成的字符串是96a17b9cs
var str="456a89b72cs"; var reg=/(\d)(\d)/g; str=str.replace(reg,function(){ return Number(arguments[1])+Number(arguments[2]); }); alert(str);//彈出96a17b9cs //上面replace里的匿名函數會被自動執行三次(因為匹配到了三次); //每次執行,arguments.length都是5;arments[0]是總正則查找到的字符串,arguments[1]是第一個分組查找到的內容,arguments[2]是第二個分組查找到的內容,arguments[3]是總正則查找到的內容在str這個字符串中的索引位置,arguments[4]是str這個字符串本般 //第一次這五個參數的值分別是:arguments[0]是"45",arguments[1]是"4",arguments[2]是"5",arguments[3]是0,arguments[4]是"456a89b72cs"; //第二次這五個參數的值分別是:arguments[0]是"89",arguments[1]是"8",arguments[2]是"9",arguments[3]是4,arguments[4]是"456a89b72cs"; //第三次這五個參數的值分別是:arguments[0]是"45",arguments[1]是"4",arguments[2]是"5",arguments[3]是0,arguments[4]是"456a89b72cs"
