replace()
方法使用一個替換值(replacement)
替換掉一個匹配模式(pattern)
在原字符串中某些或所有的匹配項,並返回替換后的字符串。這個替換模式可以是字符串或者RegExp
(正則表達式),替換值可以是一個字符串或者一個函數。
語法
str.replace(regexp|substr, newSubStr|function[, flags])
參數
- regexp:一個
RegExp
對象。該正則所匹配的內容會被第二個參數的返回值替換掉。 - substr:一個要被
newSubStr
替換的字符串。 - newSubStr:替換掉第一個參數在原字符串中的匹配部分。該字符串中可以內插一些特殊的變量名。
- function:一個用來創建新子字符串的函數,該函數的返回值將替換掉第一個參數匹配到的結果。該函數的參數描述請參考 指定一個函數作為參數 小節。
- flags:注意:
flags
參數在v8
內核(Chrome and NodeJs)
中不起作用。一個字符串指定正則表達式標志的組合。在String.prototype.replace()
方法中使用flags
參數不是符合標准的並且不贊成這樣做。使用一個帶有相應標志(flags)
的RegExp
對象來代替此參數。該參數的值應該是下面的一個或多個字符,具體作用見下:
標簽 | 描述 |
---|---|
g |
全局匹配 |
i |
忽略大小寫 |
m |
多行模式 |
y |
sticky |
返回值
一個部分或全部匹配由替代模式所取代的新的字符串。
描述
該方法並不改變調用它的字符串本身,而只是返回替換后的字符串。
在進行全局的搜索替換時,第一個參數要么時包含g
標志的正則表達式,要么時包含g
標志的字符串。
使用字符串作為參數
替換字符串可以插入下面的特殊變量名:
變量名 | 代表的值 |
---|---|
$$ |
插入一個 "$" 。 |
$& |
插入匹配的子串。 |
$` | 插入當前匹配的子串左邊的內容。 |
\$' |
插入當前匹配的子串右邊的內容。 |
\$n or \$nn |
假如第一個參數時RegExp 對象,並且n 或nn 是個十進制的數字,那么插入第n 個括號匹配的字符串。 |
指定一個函數作為參數
你可以指定一個函數作為第二個參數。在這種情況下,當匹配執行后, 該函數就會執行。 函數的返回值作為替換字符串。(注意:上面提到的特殊替換參數在這里不能被使用。)另外要注意的是,如果第一個參數是正則表達式,並且其為全局匹配模式,那么這個方法將被多次調用,每次匹配都會被調用。
下面是該函數的參數:
變量名 | 代表的值 |
---|---|
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);
示例
在 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");
print(newstr);
和上面的例子比起來,下面的例子中replace
方法的第一個參數使用字符串而不是正則表達式,g
和i
選項只能放在三個參數中。
var str = "Apples are round, and apples are juicy.";
var newstr = str.replace("apples", "oranges", "gi");
print(newstr);
這兩個例子都打印出 "oranges are round, and oranges are juicy."
在 replace()方法中使用正則直接量
下面的例子中,replace()
方法的第一個參數使用正則表達式直接量並且使用了i
(忽略大小寫)選項
var str = "Twas the night before Xmas...";
var newstr = str.replace(/xmas/i, "Christmas");
print(newstr); // Twas the night before Christmas...
打印出 "Twas the night before Christmas..."
交換字符串中的兩個單詞
下面的例子演示了如何交換一個字符串中兩個單詞的位置,這個腳本使用$1
和 $2
代替替換文本。
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
print(newstr);
打印出 "Smith, John"
。
使用一個函數來修改匹配到的字符。
在這個例子中,所有出現的大寫字母轉換未小寫,並且在匹配位置前加一個連字符。重要的是,在返回一個替換了的字符串前需要在匹配元素前需要進行添加操作。
在返回前,替換函數允許匹配片段作為參數,並且將它和連字符進行連接作為新的片段。
function styleHyphenFormat(propertyName) {
function upperToHyphenLower(match) {
return '-' + match.toLowerCase();
}
return propertyName.replace(/[A-Z]/g, upperToHyphenLower);
}
此代碼 styleHyphenFormat('borderTop')
將返回 'border-top'
。
因為我們想在最終的替換中進一步轉變匹配結果,所以我們必須使用一個函數。這迫使我們在使用toLowerCase()
方法前進行評估。如果我們嘗試不用一個函數進行匹配,那么使用toLowerCase()
方法將不會有效。
var newString = propertyName.replace(/[A-Z]/, '-' + '$&'.toLowerCase()); // won't work
這是因為'$&'.toLowerCase()
首先作為一個字符串(導致相同的'$&')之前使用字符作為模式。
將華氏溫度轉換為對等的攝氏溫度
下面的例子演示如何將華氏溫度轉換為對等的攝氏溫度。華氏溫度用一個數字加一個"F"
來表示,這個函數將返回一個數字加"C"
來表示的攝氏溫度。例如,如果輸入是212F
,這個函數將返回100C
。如果輸入數字時0F
,這個方法將返回"-17.77777777777778C"
。
正則表達式test
檢查任何數字是否以F
結尾。華氏溫度通過第二個參數p1
進入函數。這個函數基於華氏溫度作為字符串傳遞給f2c
函數設置成攝氏溫度。然后f2c()
返回攝氏溫度。這個函數與Perl
的 s///e
標志相似。
function f2c(x) {
function convert(match, p1, offset, s) {
return ((p1-32) * 5/9) + "C";
}
var test = /(\d+(?:\.\d*)?)F/g;
return x.replace(test, convert);
}
數字轉為千分位
數字千分位就是將數字三個一分,如1234567890
轉為1,234,567,890
。
var str = "1234567890";
str.replace(/\d{1,3}(?=(\d{3})+$)/g, function(match) {
return match + ',';
});
詳簡:正則表達式/\d{1,3}(?=(\d{3})+$)/g
中的\d
表示匹配數字,{1,3}
表示匹配1到3次,\d{1,3}
表示匹配連續的1到3個數字,\d{3}
匹配連續的三個數字,(?=)
表示反向匹配,即為從后向前匹配,(?=(\d{3})+$)
就表示從后向前三位數字一匹配,至少匹配一次,而最前面必須有1到3個數字,即第一次的\d{1,3}
,最后的參數g
表示全局匹配,匹配完所有。
下面在回調函數中多添加幾個參數。
var str = "1234567890";
str.replace(/\d{1,3}(?=(\d{3})+$)/g, function(match, p1, offset, string) {
//return s+',';
console.log(match, p1, offset, string);
});
match
為\d{1,3}
匹配到的字符串,p1
是(\d{3})
每次匹配到的字符串,offset
為match
的起始位置(從0開始),string
始終為原始字符串。
輸出結果如下:
1 890 0 1234567890
234 890 1 1234567890
567 890 4 1234567890
參考
以上文章多數拷貝於replace(),本人也翻譯了一部分,有什么錯誤及理解不當的地方還望指正!