正規表示式中的exec和match方法的區別

2021-09-26 20:03:59 字數 3256 閱讀 2890

正規表示式中的execmatch方法的區別

字串的正則方法有:match()、replace()、search()、split()

正則物件的方法有:exec()、test()

1.match

match方法屬於string正則表達方法. 

語法: str.match(regexp)

str:要進行匹配的字串. regexp:乙個正規表示式(或者由regexp()構造成的正規表示式)

match的用法主要區分就是,正規表示式是否有全域性標示g.

1)如果有g全域性標誌,那麼返回的陣列儲存的是,所有匹配的內容,不包過子匹配。

2)如果沒有g全域性標誌,那麼返回的陣列arr.arr[0]儲存的是完整的匹配.arr[1]儲存的是第乙個括號裡捕獲的字串,依此類推arr[n]儲存的是第n個括號捕獲的內容.也就是當包含有全域性的標誌時則返回的結果第乙個是正確匹配的結果,後面依次是子匹配的結果。

2.exec

與match方法不同exec屬於正規表示式的方法.

語法:var result1 = regexp.exec(str);

regexp:正規表示式(可以直接定義也可以利用regexp的方式定義) str:要匹配的字串

exec與match的關聯就是exec(g有沒有都無影響)就等價於不含有g全域性標誌的match.即返回陣列arr[0]為匹配的完整串.其餘的為括號裡捕獲的字串(當含有子匹配時).

1、如果exec執行的正規表示式沒有子表示式(小括號內的內容,如/abc(\s*)/中的(\s*) ),如果有匹配,就返回第乙個匹配的字串內容,此時的類陣列中的第乙個元素為匹配的內容,(類陣列中還包含有index:匹配字串在原始字串中的位置,input:輸入的字串)如果沒有匹配返回null;

var reg = new regexp("abc") ;

var str = "3abc4,5abc6";

alert(reg.exec(str));

alert(str.match(reg));

執行如上**,你會發現兩者內容均為一樣:abc,此時exec 中沒有子表示式同時兩者均為非全域性的匹配

********子表示式捕獲的內容就是指的第乙個完全匹配的字串中在表示式匹配的部分:

var a=/^([^.]*)(?:\.(.+)|)$/;

var str="click.41646ass.sss";

var b=a.exec(str); console.log(b)

輸出["click.41646ass.sss", "click", "41646ass.sss"],正規表示式中共有三個括號但是第二個大括號採用?:的方法取消了捕獲,也就是不輸出匹配字串中該子表示式匹配的部分,click對應([^.]*),41646ass.sss對應(.+),所以當為a=/^([^.]*)(\.(.+)|)$/時輸出的結果為:["click.41646ass.sss", "click",".41646ass.sss" ,"41646ass.sss"],.41646ass.sss對應於(?:\.(.+)|)

2、當exec和match中具有相同的子表示式且為非全域性匹配時兩者的輸出也是相同的,同時輸出的陣列中含有的多個元素。

var str="visit w3cschool  a w3cschool bull";

var reg=new regexp("w3c(school)");

var b=reg.exec(str);

console.log(b);

console.log(str.match(/w3c(school)/));

執行上訴**的結果為w3cschool,school

3、當為全域性匹配時

var str="visit w3cschool  a w3cschool bull";

var reg=new regexp("w3cschool",'g');

var b=reg.exec(str);

console.log(b);

console.log(str.match(/w3cschool/g));

exec中沒有子表示式其輸出為w3cschool,其輸出只乙個,match全域性匹配時其輸出元素中將包含所有的匹配項,其輸出為w3cshcool,w3cschool

總結為:

(1)exec中不管是不是全域性的匹配,只要沒有子表示式,其返回的都只有乙個元素,如果是全域性匹配,可以利用lastindex進行下乙個匹配,匹配成功後lastindex的值將會變為上次匹配的字元的最後乙個位置的索引。在設定g屬性後,雖然匹配結果不受g的影響,返回結果仍然是乙個陣列(第乙個值是第乙個匹配到的字串,以後的為分組匹配內容),但是會改變index和 lastindex等的值,將該物件的匹配的開始位置設定到緊接這匹配子串的字元位置,當第二次呼叫exec時,將從lastindex所指示的字元位置 開始檢索。同樣match方法在設定了g屬性後,也會改變index和lastindex的值,但是是一次性的。無法像exec那樣能逐過程累積,因此無 法累積獲取下一次檢索的位置。

var patt = new regexp('ab', 'g');

var str = 'abcdef12ab34cd56ef';

var ret;

while((ret = patt.exec(str))!=null)

注意:當沒有全域性的變數g時,由於index和lastindex的值不會變化(除非手動修改),則會導致每次的陪匹配都是從字串的頭開始的,所以只要字串中有匹配,就會導致死迴圈,當時設定g後,會自動改變前面的兩個屬性,會依次向後匹配直到沒有匹配項退出迴圈

輸出結果:

ab

ret.input=abcdef12ab34cd56ef

ret.index=0

regexp.lastindex =2

abret.input=abcdef12ab34cd56ef

ret.index=8

regexp.lastindex =10

(2)match在非全域性匹配時其他幾種情況下(有無子匹配的情況下)的返回結果和exec是相同的,在全域性匹配時其將返回包含所有匹配項的陣列(其中不包含子匹配)。

(3)exec返回的是類陣列而match返回的則是陣列

JS 正規表示式 exec

校驗是否全由數字組成 function isdigit s if patrn.exec s return false return true 校驗登入名 只能輸入5 20個以字母開頭 可帶數字 的字串 function isregisterusername s a za z0 9 if patrn....

JS 正規表示式 exec

校驗是否全由數字組成 function isdigit s if patrn.exec s return false return true 校驗登入名 只能輸入5 20個以字母開頭 可帶數字 的字串 function isregisterusername s a 校驗是否全由數字組成 functi...

JavaScript正規表示式 exec

校驗是否全由數字組成 function isdigit s if patrn.exec s return false return true 校驗登入名 只能輸入5 20個以字母開頭 可帶數字 的字串 function isregisterusername s a za z0 9 if patrn....