簡單介紹一下javascript中replace的用法
先看一下MSDN中的介紹
replace 方法
返回根據正則表達式進行文字替換后的字符串的復制。
stringObj.replace(rgExp, replaceText)
參數
stringObj
必選項。要執行該替換的 String 對象或字符串文字。該字符串不會被 replace 方法修改。
rgExp
必選項。為包含正則表達式模式或可用標志的正則表達式對象。也可以是 String 對象或文字。如果 rgExp 不是正則表達式對象,它將被轉換為字符串,并進行精確的查找;不要嘗試將字符串轉化為正則表達式。
replaceText
必選項。是一個String 對象或字符串文字,對于stringObj 中每個匹配 rgExp 中的位置都用該對象所包含的文字加以替換。在 Jscript 5.5 或更新版本中,replaceText 參數也可以是返回替換文本的函數。如果 replaceText 是一個函數,對于每個匹配的子字符串,調用該函數時帶有下面的 m + 3 個參數,這里 m 是在 rgExp 中用于捕獲的左括弧的個數。第一個參數是匹配的子字符串。接下來的 m 個參數是搜索中捕獲到的全部結果。參數 m + 2 是當前字符串對象中發生匹配位置的偏移量,而參數 m + 3 是當前字符串對象。結果為將每一匹配的子字符串替換為函數調用的相應返回值后的字符串值。
其實光這么看,一定迷糊,讓我們舉幾個例子,解開replace的神秘面紗
exp1:
這個是最常見的,也是最簡單的了。我直接就盜用MSDN的例子了
var r, re; //Declare variables.
var ss = "The man hit the ball with the bat.";
re = /The/g; //Create regular expression pattern.
r = ss.replace(re, "A"); //Replace "The" with "A".
return(r); //Return string with replacement made.
}
這個函數返回的就是"A man hit the ball with the bat."這個字符串.其實這里用正則有點大財小用,我們可以直接把
re = /The/g; //Create regular expression pattern.
r = ss.replace(re, "A"); //Replace "The" with "A".
換成r = ss.replace("The", "A");最終結果是一樣的,這個比較簡單,沒有可說的,要注意的是ss.replace("The", "A")以后ss是沒有變化的
,還是"The man hit the ball with the bat.",只不過是這個方法返回了新的字符串。
exp2:
var r, re; //Declare variables.
var ss = "The rain in Spain falls mainly in the plain.";
re = /(S+)(s+)(S+)/g; //Create regular expression pattern.
r = ss.replace(re, "$3$2$1"); //Swap each pair of words.
return(r); //Return resulting string.
}
這個比較典型。剛開始看這個"$3$2$1"不懂是啥意思,MSDN這樣解釋
$$ $(JScript 5.5 或更高版本)
$& 指定當前字符串對象中與整個模式相匹配的部分。(JScript 5.5 或更高版本)
$` 指定當前字符串對象中位于 $& 所描述的匹配前面的部分。(JScript 5.5 或更高版本)
$' 指定當前字符串對象中位于 $& 所描述的匹配后面的部分。(JScript 5.5 或更高版本)
$n 第 n 個捕獲到的子匹配,這里 n 為從 1 到 9 的十進制一位數。(JScript 5.5 或更高版本)
$nn 第 nn 個捕獲到的子匹配,這里 nn 為從 01 到 99 的十進制二位數。(JScript 5.5 或更高版本)
這樣看就有思路了。現在這個re = /(\S+)(\s+)(\S+)/g;有3個括號,也就是相當于3個匹配。而這個$1、$2、$3就分別代表這3個匹配。
回到這個例子當中。re = /(\S+)(\s+)(\S+)/g就來匹配一個非空串+一個空串+一個非空串,也就是會非別匹配"The rain"、"in Spain"、
"falls mainly"、"in the"。這些都會被匹配。
實際上是這個函數一共找到了4個符合條件的字符串。第一個是"The rain",這個字符串的3部分"The"、" "(空格)、"rain"分別對應$1$2$3這3個子匹配。 現在再看這句話就簡單了r = ss.replace(re, "$3$2$1"),它的意思就是把找到的每個串的這3個子匹配的順序調整。第一個就是"rain The"。同理,后面的幾個字符串都這樣顛倒一下。最終結果就是"rain The Spain in mainly falls the in plain."。不難理解吧。
當然嘍,你不一定對這3個正則都要處理的。比如我現在想把這個字符串中的所有空格后面加"_",要怎么寫呢?這樣來寫,
re = /(\s+)/g;
r = ss.replace(re, "$1_");
這樣就可以了,但是發覺這種用法還不如第一種用的多。不要緊,我們主要是用來給第三種用法作鋪墊。現在我想把空格去掉,怎么做?
exp3:
var r, re; //Declare variables.
var ss = "The rain in Spain falls mainly in the plain.";
re = /(s+)/g; //Create regular expression pattern.
r = ss.replace(re, function(){return "";}); //Swap each pair of words.
return(r); //Return resulting string.
}
先來深刻理解這句話:如果 replaceText 是一個函數,對于每個匹配的子字符串,調用該函數時帶有下面的 m + 3 個參數,這里 m 是在 rgExp 中用于捕獲的左括弧的個數。第一個參數是匹配的子字符串。接下來的 m 個參數是搜索中捕獲到的全部結果。參數 m + 2 是當前字符串對象中發生匹配位置的偏移量,而參數 m + 3 是當前字符串對象。結果為將每一匹配的子字符串替換為函數調用的相應返回值后的字符串值。
用上面的例子來解釋這句話吧。對于這個函數function(){return "";}實際上有4參數的,也就是上面所說的m+3個。這里m=1,是正則表達式中左括號的個數,也就是一個。而這4個參數分別是匹配到的子字符串、(\s+)匹配到的字符串、匹配的位置、整個字符串(就是"The rain in Spain falls mainly in the plain.")這次一共匹配了8個,因為有8個空格嘛。我這里沒有寫參數,因為我直接就返回了""。也就是說我一找到一個(\s+)我就把它換成""。實際上這個函數里面你可以寫很多自己想得到的結果了。
接著盜用MSDN的例子
var test = /(d+(.d*)?)F/g; //Initialize pattern.
return(s.replace
(test,
function($0,$1,$2) {
return((($1-32) * 5/9) + "C");
}
)
);
}
document.write(f2c("Water freezes at 32F and boils at 212F."));
document.write(f2c("Water freezes at 32F and boils at 212F."));
現在看這個就簡單了吧。 var test = /(\d+(\.\d*)?)F\b/g; 正則里面有倆左括號吧。所以現在這個function($0,$1,$2)實際上有2+3個參數,那為何只寫3個呢?鬼才知道,其實連3個都不用,寫倆就好了function($0,$1)。因為本例中我們只用到$1。有人可能還會問,既然我們只用到$1,為何還要寫$0呢。其實$0,$1只不過是參數,實際我們想用的是第二個參數。可能你又忘記第二個參數代表什么了,再看一遍:如果 replaceText 是一個函數,對于每個匹配的子字符串,調用該函數時帶有下面的 m + 3 個參數,這里 m 是在 rgExp 中用于捕獲的左括弧的個數。第一個參數是匹配的子字符串。接下來的 m 個參數是搜索中捕獲到的全部結果。參數 m + 2 是當前字符串對象中發生匹配位置的偏移量,而參數 m + 3 是當前字符串對象。結果為將每一匹配的子字符串替換為函數調用的相應返回值后的字符串值。$0是整個子字符串,$1是第一個括號內匹配到的字符串。本例中一共匹配了兩次,第一次中$0為"32F",$1為"32"。第二次中$0為"212F",$1為"212"。
似乎replace基本就是這么用了,很多高級用法無非是經過這三種形式結合的。慢慢理解一下,還是比較簡單的。