1. 程式人生 > >【javascript】正則表達式match、exec和test的使用

【javascript】正則表達式match、exec和test的使用

p s 下標 mat http [0 使用 regex es2017 false

正則表達式match、exec和test的使用

match和exec在匹配成功時返回的都是數組,在沒有匹配上時返回的都是null;test在匹配成功是返回true,在沒有匹配時返回的是false。match是String的方法,而test和exec是RegExp的方法。本文探討的是全局匹配與分組匹配的問題,並有源碼附著。

一、全局匹配

1.正則表達式可以使用RegExp對象定義,也可以使用常量表達式定義。

var regexp=new RegExp(/\w+/gi); 
或者
var regexp=/w+/gi;

2.(1)當不使用全局變量的時候,match與exec的方法是一樣的,每次都是對需要匹配的字符串進行第一次匹配。

1    var re = new RegExp(/([a-z]+)=(\d+)/i);  
2    var str = "cs=2013 kd=2015";
3    document.write("exec:"+re.exec(str)+"<br />");
4    document.write("match:"+str.match(re)+"<br />");
5    document.write("test:"+re.test(str)+"<br />"); 
6    document.write("<br /><br />"); 
7 document.write("exec:"+re.exec(str)+"<br />"); 8 document.write("match:"+str.match(re)+"<br />"); 9 document.write("test:"+re.test(str)+"<br />");

結果輸出:

技術分享

(2)當使用全局變量的時候,exec與match不一樣。exec每次執行都是從上一次執行結束之後的位置繼續執行所以不一樣,而match每次執行的結果都是一樣的。

1    var re = new RegExp(/([a-z]+)=(\d+)/gi);  
2 var str = "cs=2013 kd=2015"; 3 document.write("exec:"+re.exec(str)+"<br />"); 4 document.write("match:"+str.match(re)+"<br />"); 5 document.write("test:"+re.test(str)+"<br />"); 6 document.write("<br /><br />"); 7 document.write("exec:"+re.exec(str)+"<br />"); 8 document.write("match:"+str.match(re)+"<br />"); 9 document.write("test:"+re.test(str)+"<br />");

結果輸出:

技術分享

二、分組

無全局匹配分組時,match和exec返回結果相同。由於正則表達式采用了括號分組,所以在返回匹配結果的同時,依次返回該結果的所有分組。exec得到的結果與match得到的結果不一樣,match將所有匹配到的結果一次性存入數組當中返回,而exec按照順序進行匹配,所以需要使用while循環進行一次輸出。對exec返回結果進行數組下標訪問的結果是每一個完整匹配都會返回一個數組,依次為該匹配到的 [完整序列,子序列1,子序列2,。。。,子序列n],所有exec[0]是完整序列,只有的全都是括號內的()子序列。在此樣例中,exec比match效果更為好,在於可以exec對等號兩邊直接劃分,即:exec[1]=exec[2],可以直接訪問到。而match更為麻煩些,可以通過match[0].split("=")將兩個序列分開,而match[0][0]只是擁有一個字母,並不是實際當中的語義塊。

 1 var str = "?id=21&rid=4&page=5";
 2 var regexp=/([a-z]+)=(\d+)/ig;
 3 var match = str.match(regexp);
 4 
 5 for(var k=0;k<match.length;k++){
 6     document.write(match[k]+"<br/>");
 7 }
 8 document.write("<br /><br /><br /><br />");
 9 
10 var i=1; 
11 while(exec= regexp.exec(str)){
12     document.write("第"+i+"次:"+exec+":"+exec[0]+"---->"+exec[1]+"<br/>");
13     i++;
14 } 

結果如圖:

技術分享

【javascript】正則表達式match、exec和test的使用