#### JavaScript replace() 方法
#### 定義和用法
replace() 方法用于在字符串中用一些字符替換另一些字符,或替換一個與正則表達式匹配的子串。
#### 語法
~~~
stringObject.replace(regexp|substr, newSubStr|function)
~~~
replace() 方法返回一個由替換值替換一些或所有匹配的模式后的新字符串。模式可以是一個字符串或者一個正則表達式, 替換值可以是一個字符串或者一個每次匹配都要調用的函數。
注意:原字符串不會改變。
#### 參數
* regexp (pattern)
一個RegExp 對象或者其字面量。該正則所匹配的內容會被第二個參數的返回值替換掉。
* substr (pattern)
一個要被 newSubStr 替換的字符串。其被視為一整個字符串,而不是一個正則表達式。僅僅是第一個匹配會被替換。
* newSubStr (replacement)
用于替換掉第一個參數在原字符串中的匹配部分的字符串。該字符串中可以內插一些特殊的變量名。參考下面的使用字符串作為參數。
* function (replacement)
一個用來創建新子字符串的函數,該函數的返回值將替換掉第一個參數匹配到的結果。參考下面的指定一個函數作為參數。
#### 指定一個函數作為參數
你可以指定一個函數作為第二個參數。在這種情況下,當匹配執行后, 該函數就會執行。函數的返回值作為替換字符串。 (注意: 上面提到的特殊替換參數在這里不能被使用。) 另外要注意的是, 如果第一個參數是正則表達式, 并且其為全局匹配模式, 那么這個方法將被多次調用, 每次匹配都會被調用。
下面是該函數的參數:
|變量名|代表的值 |
| --- | --- |
|match|匹配的子串。(對應于上述的$&。)|
|p1,p2, ... |假如replace()方法的第一個參數是一個RegExp 對象,則代表第n個括號匹配的字符串。(對應于上述的$1,$2等。)|
|offset|匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是“abcd”,匹配到的子字符串是“bc”,那么這個參數將是1)|
|string|被匹配的原字符串。|
(精確的參數個數依賴于replace()的第一個參數是否是一個正則表達式對象, 以及這個正則表達式中指定了多少個括號子串。)
下面的例子將會使 newString 變成`'abc - 12345 - #$*%' `:
~~~
function replacer(match, p1, p2, p3, offset, string) {
// p1 is nondigits, p2 digits, and p3 non-alphanumerics
return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
console.log(newString); // abc - 12345 - #$*%
~~~
在 replace() 中使用正則表達式
在下面的例子中,replace() 中使用了正則表達式及忽略大小寫標示。
~~~
var str = 'Twas the night before Xmas...';
var newstr = str.replace(/xmas/i, 'Christmas');
console.log(newstr); // Twas the night before Christmas...
~~~
在 replace() 中使用 global 和 ignore 選項
下面的例子中,正則表達式包含有全局替換(g)和忽略大小寫(i)的選項,這使得replace方法用'oranges'替換掉了所有出現的"apples".
~~~
var re = /apples/gi;
var str = "Apples are round, and apples are juicy.";
var newstr = str.replace(re, "oranges");
// oranges are round, and oranges are juicy.
console.log(newstr);
~~~
交換字符串中的兩個單詞
下面的例子演示了如何交換一個字符串中兩個單詞的位置,這個腳本使用$1 和 $2 代替替換文本。
~~~
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
// Smith, John
console.log(newstr);
~~~
使用行內函數來修改匹配到的字符。
在這個例子中,所有出現的大寫字母轉換為小寫,并且在匹配位置前加一個連字符。重要的是,在返回一個替換了的字符串前需要在匹配元素前需要進行添加操作。
在返回前,替換函數允許匹配片段作為參數,并且將它和連字符進行連接作為新的片段。
~~~
function styleHyphenFormat(propertyName) {
function upperToHyphenLower(match) {
return '-' + match.toLowerCase();
}
return propertyName.replace(/[A-Z]/g, upperToHyphenLower);
}
~~~
此代碼 `styleHyphenFormat('borderTop') `將返回 `'border-top'`。
將華氏溫度轉換為對等的攝氏溫度
下面的例子演示如何將華氏溫度轉換為對等的攝氏溫度。華氏溫度用一個數字加一個"F"來表示,這個函數將返回一個數字加"C"來表示的攝氏溫度。例如,如果輸入是212F,這個函數將返回100C。如果輸入數字時0F,這個方法將返回"-17.77777777777778C"。
正則表達式test檢查任何數字是否以 F 結尾。華氏溫度通過第二個參數p1進入函數。這個函數基于華氏溫度作為字符串傳遞給f2c函數設置成攝氏溫度。然后f2c()返回攝氏溫度。這個函數與Perl的 s///e 標志相似。
~~~
function f2c(x)
{
function convert(str, p1, offset, s)
{
return ((p1-32) * 5/9) + "C";
}
var s = String(x);
var test = /(\d+(?:\.\d*)?)F\b/g;
return s.replace(test, convert);
}
~~~
* * * * *
[MDN參考資料](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace)