標籤:arch 多個 第一個 www deb code news blog limit
js正則函數match、exec、test、search、replace、split使用介紹集合
1.match 方法
使用Regex模式對字串執行尋找,並將包含尋找的結果作為數組返回。
stringObj.match(rgExp)
參數
stringObj
必選項。對其進行尋找的 String 對象或字串文字。
rgExp
必選項。為包含Regex模式和可用標誌的Regex對象。也可以是包含Regex模式和可用標誌的變數名或字串文字。
其餘說明與exec一樣,不同的是如果match的運算式匹配了全域標記g將出現所有匹配項,而不用迴圈,但所有匹配中不會包含子匹配項。
例子1:
function MatchDemo(){
var r, re; // 聲明變數。
var s = "The rain in Spain falls mainly in the plain";
re = /(a)in/ig; // 建立Regex模式。
r = s.match(re); // 嘗試去匹配搜尋字串。
document.write(r); // 返回的數組包含了所有 "ain" 出現的四個匹配,r[0]、r[1]、r[2]、r[3]。 // 但沒有子匹配項a。
} //輸出結果:ain,ain,ain,ain
2.exec 方法
用Regex模式在字串中尋找,並返回該尋找結果的第一個值(數組),如果匹配失敗,返回null。
rgExp.exec(str)
參數
rgExp
必選項。包含Regex模式和可用標誌的Regex對象。
str
必選項。要在其中執行尋找的 String 對象或字串文字。
返回數組包含:
input:整個被尋找的字串的值;
index:匹配結果所在的位置(位);
lastInput:下一次匹配結果的位置;
arr:結果值,arr[0]全匹配結果,arr[1,2...]為運算式內()的子匹配,由左至右為1,2...。
例子2:
複製代碼代碼如下:
function RegExpTest(){
var src="http://sumsung753.blog.163.com/blog/I love you!";
var re = /\w+/g; // 注意g將全文匹配,不加將永遠只返回第一個匹配。
var arr;
while((arr = re.exec(src)) !=null){ //exec使arr返回匹配的第一個,while迴圈一次將使re在g作用尋找下一個匹配。
document.write(arr.index + "-" + arr.lastIndex + ":" + arr + "<br/>");
for(key in arr){
document.write(key + "=>" + arr[key] + "<br/>");
}
document.write("<br/>");
}
}
window.onload = RegExpTest();
輸出結果:
0-1:I //0為index,i所在位置,1為下一個匹配所在位置
input=>I love you!
index=>0
lastIndex=>1
0=>I
2-6:love
input=>I love you!
index=>2
lastIndex=>6
0=>love
7-10:you
input=>I love you!
index=>7
lastIndex=>10
0=>you
說明:根據手冊,exec只返回匹配結果的第一個值,比如上例如果不用while迴圈,將只返回‘I‘(儘管i空格後的love和you都符合運算式),無論re運算式用不用全域標記g。但是如果為Regex設定了全域標記g,exec 從以 lastIndex 的值指示的位置開始尋找。如果沒有設定全域標誌,exec 忽略 lastIndex 的值,從字串的起始位置開始搜尋。利用這個特點可以反覆調用exec遍曆所有匹配,等價於match具有g標誌。
當然,如果Regex忘記用g,而又用迴圈(比如:while、for等),exec將每次都迴圈第一個,造成死迴圈。
exec的輸出將包含子匹配項。
例子3:
複製代碼代碼如下:
function execDemo(){
var r, re; // 聲明變數。
var s = "The rain in Spain falls mainly in the plain";
re = /[\w]*(ai)n/ig;
r = re.exec(s);
document.write(r + "<br/>");
for(key in r){
document.write(key + "-" + r[key] + "<br/>");
}
}
window.onload = execDemo();
輸出:
rain,ai
input-The rain in Spain falls mainly in the plain
index-4
lastIndex-8
0-rain
1-ai
3.test 方法
返回一個 Boolean 值,它指出在被尋找的字串中是否匹配給出的Regex。
rgexp.test(str)
參數
rgexp
必選項。包含Regex模式或可用標誌的Regex對象。
str
必選項。要在其上測試尋找的字串。
說明
test 方法檢查字串是否與給出的Regex模式相匹配,如果是則返回 true,否則就返回 false。
例子4:
複製代碼代碼如下:
function TestDemo(re, s){
var s1;
if (re.test(s))
s1 = " 匹配正則式 ";
else
s1 = " 不匹配正則式 ";
return("‘" + s + "‘" + s1 + "‘"+ re.source + "‘");
}
window.onload = document.write(TestDemo(/ab/,‘cdef‘));
輸出結果:‘cdef‘ 不匹配正則式 ‘ab‘
注意:test()繼承Regex的lastIndex屬性,運算式在匹配全域標誌g的時候須注意。
例子5:
複製代碼代碼如下:
function testDemo(){
var r, re; // 聲明變數。
var s = "I";
re = /I/ig; // 建立Regex模式。
document.write(re.test(s) + "<br/>"); // 返回 Boolean 結果。
document.write(re.test(s) + "<br/>");
document.write(re.test(s));
}
testDemo();
輸出結果:
true
false
true
當第二次調用test()的時候,lastIndex指向下一次匹配所在位置1,所以第二次匹配不成功,lastIndex重新指向0,等於第三次又重新匹配。下例顯示test的lastIndex屬性:
例子6:
複製代碼代碼如下:
function testDemo(){
var r, re; // 聲明變數。
var s = "I";
re = /I/ig; // 建立Regex模式。
document.write(re.test(s) + "<br/>"); // 返回 Boolean 結果。
document.write(re.lastIndex); // 返回 Boolean 結果。
}
testDemo();
輸出:
true
1
解決方案:將test()的lastIndex屬性每次重新指向0,re.lastIndex = 0;
4.search 方法
返回與Regex尋找內容匹配的第一個子字串的位置(位移位)。
stringObj.search(rgExp)
參數
stringObj
必選項。要在其上進行尋找的 String 對象或字串文字。
rgExp
必選項。包含Regex模式和可用標誌的Regex對象。
說明:如果找到則返回子字元至開始處的位移位,否則返回-1。
例子6:
複製代碼代碼如下:
function SearchDemo(){
var r, re; // 聲明變數。
var s = "The rain in Spain falls mainly in the plain.";
re = /falls/i; // 建立Regex模式。
re2 = /tom/i;
r = s.search(re); // 尋找字串。
r2 = s.search(re2);
return("r:" + r + ";r2:" + r2); // 返回 Boolean 結果。
}
document.write(SearchDemo());
輸出:r:18;r2:-1
5.replace 方法
返回根據Regex進行文字替換後的字串的複製。
stringObj.replace(rgExp, replaceText)
參數
stringObj
必選項。要執行該替換的 String 對象或字串文字。該字串不會被 replace 方法修改。
rgExp
必選項。為包含Regex模式或可用標誌的Regex對象。也可以是 String 對象或文字。如果 rgExp 不是Regex對象,它將被轉換為字串,並進行精確的尋找;不要嘗試將字串轉化為Regex。
replaceText
必選項。是一個String 對象或字串文字,對於stringObj 中每個匹配 rgExp 中的位置都用該對象所包含的文字加以替換。在 Jscript 5.5 或更新版本中,replaceText 參數也可以是返回替換文本的函數。
說明
replace 方法的結果是一個完成了指定替換的 stringObj 對象的複製。意思為匹配的項進行指定替換,其它不變作為StringObj的原樣返回。
ECMAScript v3 規定,replace() 方法的參數 replacement 可以是函數而不是字串。在這種情況下,每個匹配都調用該函數,它返回的字串將作為替換文本使用。該函數的第一個參數是匹配模式的字串。接下來的參數是與模式中的子運算式匹配的字串,可以有 0 個或多個這樣的參數。接下來的參數是一個整數,聲明了匹配在 stringObject 中出現的位置。最後一個參數是 stringObject 本身。結果為將每一匹配的子字串替換為函數調用的相應傳回值的字串值。函數作參可以進行更為複雜的操作。
例子7:
複製代碼代碼如下:
function f2c(s) {
var test = /(\d+(\.\d*)?)F\b/g; // 說明華氏溫度可能模式有:123F或123.4F。注意,這裡用了g模式
return(s.replace
(test,
function(Regstr,$1,$2,$3,newstrObj) {
return(("<br/>" + Regstr +"<br/>" + ($1-32) * 1/2) + "C" +"<br/>" + //以下兩行進行替換
$2 +"<br/>" + $3 +"<br/>" + newstrObj +"<br/>" );
}
)
);
}
document.write(f2c("Water: 32.2F and Oil: 20.30F."));
輸出結果:
Water: //不與正則匹配的字元,按原字元輸出
32.2F //與正則相匹配的第一個字串的原字串 Regstr
0.10000000000000142C //與正則相匹配的第一個字串的第一個子模式比對的替換結果 $1
.2 //與正則相匹配的第一個字串的第二個子模式比對項的替換結果,這裡我們沒有將它替換 $2
7 //與正則相匹配的第一個字串的第一個子匹配出現的位移量 $3
Water: 32.2F and Oil: 20.30F. //原字串 newstrObj
and Oil: //不與正則匹配的字元
20.30F //與正則相匹配的第二個字串的原字串
-5.85C //與正則相匹配的第二個字串的第一個子模式與匹配的替換結果
.30 //與正則相匹配的第二個字串的第二個子模式比對項的替換結果,這裡我們沒有將它替換
22 //與正則相匹配的第二個字串的第一個子匹配出現的位移量
Water: 32.2F and Oil: 20.30F. //原字串
. //不與正則匹配的字元
上面的函數參數我們全部用到了。在實際中,我們只須用將xxF替換為xxC,根據要求,我們無須寫這麼多參數。
例子8:
複製代碼代碼如下:
function f2c(s) {
var test = /(\d+(\.\d*)?)F\b/g; // 說明華氏溫度可能模式有:123F或123.4F
return(s.replace
(test,
function(strObj,$1) {
return((($1-32) * 1/2) + "C");
}
)
);
}
document.write(f2c("Water: 32.2F and Oil: 20.30F."));
輸出:Water: 0.10000000000000142C and Oil: -5.85C.
更多的應用:
例子9:
複製代碼代碼如下:
function f2c(s) {
var test = /([\d]{4})-([\d]{1,2})-([\d]{1,2})/;
return(s.replace
(test,
function($0,$1,$2,$3) {
return($2 +"/" + $1);
}
)
);
}
document.write(f2c("today: 2011-03-29"));
輸出:today: 03/2011
6.split 方法
將一個字串分割為子字串,然後將結果作為字串數組返回。
stringObj.split([separator[, limit]])
參數
stringObj
必選項。要被分解的 String 對象或文字。該對象不會被 split 方法修改。
separator
可選項。字串或 Regex 對象,它標識了分隔字串時使用的是一個還是多個字元。如果忽略該選項,返回包含整個字串的單一元素數組。
limit
可選項。該值用來限制返回數組中的元素個數。
說明
split 方法的結果是一個字串數組,在 stingObj 中每個出現 separator 的位置都要進行分解。separator 不作為任何數組元素的部分返回。
例子10:
複製代碼代碼如下:
function SplitDemo(){
var s, ss;
var s = "The rain in Spain falls mainly in the plain.";
// Regex,用不分大不寫的s進行分隔。
ss = s.split(/s/i);
return(ss);
}
document.write(SplitDemo());
輸出:The rain in ,pain fall, mainly in the plain.
jsRegex之exec()方法、match()方法以及search()方法
先看代碼:
var sToMatch = "test, Tes, tst, tset, Test, Tesyt, sTes";
var reEs = /es/gi;
alert(reEs.exec(sToMatch));
alert(sToMatch.match(reEs));
alert(sToMatch.search(reEs));
三個彈出框內容如下:
結果分析如下:
1、RegExp的exec()方法,有一個字串參數,返回一個數組,數組的第一個條目是第一個匹配;其他的是反向引用。所以第一個返回的結果是第一個匹配的值es(不區分大小寫)。
2、String對象有一個match()方法,它返回一個包含在字串中所有匹配的資料。這個方法調用string對象,同時傳給它一個RegExp對象。所以第二個彈出語句返回的是所有符合Regex的數組。
3、search()的字串方法與indexOf()有些類似,但是它使用一個RegExp對象而非僅僅一個子字串。search()方法返回第一個匹配值的位置。所以第三處彈出的是“1”,即第二個字元就匹配了。注意的是search()方法不支援全域匹配正規運算式(帶參數g)。
js正則函數match、exec、test、search、replace、split使用介紹集合