JavaScript正則表達式應用---replace()


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對象,並且nnn是個十進制的數字,那么插入第n個括號匹配的字符串。

指定一個函數作為參數

你可以指定一個函數作為第二個參數。在這種情況下,當匹配執行后, 該函數就會執行。 函數的返回值作為替換字符串。(注意:上面提到的特殊替換參數在這里不能被使用。)另外要注意的是,如果第一個參數是正則表達式,並且其為全局匹配模式,那么這個方法將被多次調用,每次匹配都會被調用

下面是該函數的參數:

變量名 代表的值
match 匹配的子串。(對應於上述的$&。)
p1p2, ... 假如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方法的第一個參數使用字符串而不是正則表達式,gi選項只能放在三個參數中。

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()返回攝氏溫度。這個函數與Perls///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})每次匹配到的字符串,offsetmatch的起始位置(從0開始),string始終為原始字符串。
輸出結果如下:

1 890 0 1234567890
234 890 1 1234567890
567 890 4 1234567890

參考

以上文章多數拷貝於replace(),本人也翻譯了一部分,有什么錯誤及理解不當的地方還望指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM