標籤:png 個數 als i++ images regex 有一個 結束 結果
Regexmatch、exec和test的使用
match和exec在匹配成功時返回的都是數組,在沒有匹配上時返回的都是null;test在匹配成功是返回true,在沒有匹配時返回的是false。match是String的方法,而test和exec是RegExp的方法。本文探討的是全域匹配與分組匹配的問題,並有源碼附著。
一、全域匹配
1.Regex可以使用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返回結果相同。由於Regex採用了括弧分組,所以在返回匹配結果的同時,依次返回該結果的所有分組。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】Regexmatch、exec和test的使用