javascript
javascript中match方法和exec()方法详解与深度区别(非原创)
match和exec的比較
1.match
match方法屬于String正則表達(dá)方法.?語(yǔ)法: str.match(regexp或者string)
str:要進(jìn)行匹配的字符串. regexp:一個(gè)正則表達(dá)式(或者由RegExp()構(gòu)造成的正則表達(dá)式)
match的用法主要區(qū)分就是,正則表達(dá)式是否有全局標(biāo)示g.
(1)如果有g(shù)全局標(biāo)志,那么返回的數(shù)組保存的是,所有匹配的內(nèi)容,不包括子匹配。
(2))如果沒(méi)有g(shù)全局標(biāo)志,那么返回的數(shù)組arr.arr[0]保存的是完整的匹配.arr[1]保存的是第一個(gè)括號(hào)里捕獲的字串,依此類推arr[n]保存的是第n個(gè)括號(hào)捕獲的內(nèi)容.也就是當(dāng)包含有全局的標(biāo)志時(shí)則返回的結(jié)果第一個(gè)是正確匹配的結(jié)果,后面依次是子匹配的結(jié)果。
看一下在控制臺(tái)輸出的結(jié)果:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>match全局方法</title> </head> <body> <p id="demo">單擊顯示查找的位置</p> <button οnclick="myFunction()">點(diǎn)我</button> <button οnclick='myFunctions()'>點(diǎn)擊</button> <script> function myFunction(){var str="thiS is my house"var n=str.match(/is/i);console.log(n); } function myFunctions(){var str="thiS is my house"document.getElementById('demo').innerHTML=str.search('is') } </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>match全局方法</title> </head> <body> <p id="demo">單擊顯示查找的位置</p> <button οnclick="myFunction()">點(diǎn)我</button> <button οnclick='myFunctions()'>點(diǎn)擊</button> <script> function myFunction(){var str="thiS is my house"var n=str.match(/is/ig);console.log(n); } function myFunctions(){var str="thiS is my house"document.getElementById('demo').innerHTML=str.search('is') } </script> </body> </html>
這就是match返回的值。
注意:在非全局匹配的時(shí)候,數(shù)組第一項(xiàng)是整段字符串的匹配,第二項(xiàng)至以后都是捕獲匹配。如果match函數(shù)加了/g標(biāo)志位,返回的數(shù)組里只包含整段字符串的匹配。
2.exec
與match方法不同exec屬于正則表達(dá)式對(duì)象的方法.
語(yǔ)法:var result1 =?regexp.exec(str);
regexp:正則表達(dá)式(可以直接定義也可以利用RegExp的方式定義) str:要匹配的字串
exec與match的關(guān)聯(lián)就是:exec(g有沒(méi)有都無(wú)影響)就等價(jià)于不含有g(shù)全局標(biāo)志的match.即返回?cái)?shù)組arr[0]為匹配的完整串。arr[1...n]為括號(hào)里捕獲的字符串(當(dāng)含有子匹配時(shí)).
(1)、如果exec執(zhí)行的正則表達(dá)式?jīng)]有子表達(dá)式(子表達(dá)式即小括號(hào)內(nèi)的內(nèi)容,如/abc(\s*)/中的(\s*)),且如果有匹配,就返回第一個(gè)匹配的字符串內(nèi)容,此時(shí)的類數(shù)組中的第一個(gè)元素為匹配的內(nèi)容,(類數(shù)組中還包含有index:匹配字符串在原始字符串中的位置,input:輸入的字符串)如果沒(méi)有匹配返回null;
另外:
var reg = new RegExp("abc") ; var str = "3abc4,5abc6"; alert(reg.exec(str)); alert(str.match(reg));
??? 執(zhí)行如上代碼,你會(huì)發(fā)現(xiàn)兩者內(nèi)容均為一樣:abc,此時(shí)exec 中沒(méi)有子表達(dá)式同時(shí)兩者均為非全局的匹配
********子表達(dá)式捕獲的內(nèi)容就是指的第一個(gè)完全匹配的字符串中在表達(dá)式匹配的部分:
var a=/^([^.]*)(?:\.(.+)|)$/;
var str="click.41646ass.sss";
var b=a.exec(str); console.log(b)
?? 輸出["click.41646ass.sss", "click", "41646ass.sss"],正則表達(dá)式中共有三個(gè)括號(hào)但是第二個(gè)大括號(hào)采用?:的方法取消了捕獲,也就是不輸出匹配字符串中該子表達(dá)式匹配的部分,click對(duì)應(yīng)([^.]*),41646ass.sss對(duì)應(yīng)(.+),所以當(dāng)為a=/^([^.]*)(\.(.+)|)$/時(shí)輸出的結(jié)果為:["click.41646ass.sss", "click",".41646ass.sss" ,"41646ass.sss"],.41646ass.sss對(duì)應(yīng)于(?:\.(.+)|)
?
(2)、當(dāng)exec和match中具有相同的子表達(dá)式且為非全局匹配時(shí)兩者的輸出也是相同的,同時(shí)輸出的數(shù)組中含有的多個(gè)元素。
var str="visit W3cschool a W3cschool bull"; var reg=new RegExp("W3c(school)"); var b=reg.exec(str); alert(b) alert(str.match(reg)) console.log(b); console.log(str.match(/W3c(school)/));
執(zhí)行上訴代碼的結(jié)果都為W3cschool,school
?
(3)、當(dāng)為全局匹配時(shí)
?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中沒(méi)有子表達(dá)式其輸出為W3cschool,其輸出只一個(gè),match全局匹配時(shí)其輸出元素中將包含所有的匹配項(xiàng),其輸出為W3cshcool,W3cschool
總結(jié)為:
(1)Match在非全局匹配時(shí)其他幾種情況下(有無(wú)子匹配的情況下)的返回結(jié)果和exec是相同的,在全局匹配時(shí)其將返回包含所有匹配項(xiàng)的數(shù)組(其中不包含子匹配)。
(2)exec中不管是不是全局的匹配,只要沒(méi)有子表達(dá)式,其返回的都只有一個(gè)元素.
如果是全局匹配,可以利用其非全局匹配沒(méi)有的的lastIndex屬性進(jìn)行下一個(gè)匹配,匹配成功后lastIndex的值將會(huì)變?yōu)樯洗纹ヅ涞淖址淖詈笠粋€(gè)位置的索引。在設(shè)置g屬性后,雖然匹配結(jié)果不受g的影響,返回結(jié)果仍然是一個(gè)數(shù)組(第一個(gè)值是第一個(gè)匹配到的字符串,以后的為分組匹配內(nèi)容),但是會(huì)改變index和 lastIndex等的值,將該對(duì)象的匹配的開(kāi)始位置設(shè)置到緊接這匹配子串的字符位置,當(dāng)?shù)诙握{(diào)用exec時(shí),將從lastIndex所指示的字符位置開(kāi)始檢索。同樣match方法在設(shè)置了g屬性后,也會(huì)改變index和lastIndex的值,但是是一次性的。無(wú)法像exec那樣能逐過(guò)程累積,因此無(wú)法累積獲取下一次檢索的位置。(match的全局匹配返回的值本身沒(méi)有l(wèi)astIndex和index屬性,這里只是引用其含義來(lái)說(shuō)明問(wèn)題)
??
var patt = new RegExp('ab', 'g'); var str = 'abcdef12ab34cd56ef'; var ret;while((ret = patt.exec(str))!=null) {document.write(ret+"</br>");document.write("ret.input="+ret.input+"</br>");document.write("ret.index="+ret.index+"</br>");document.write("RegExp.lastIndex ="+patt.lastIndex +"</br>"); }注意:當(dāng)沒(méi)有全局的變量g時(shí),由于index和lastindex的值不會(huì)變化(除非手動(dòng)修改),則會(huì)導(dǎo)致每次的陪匹配都是從字符串的頭開(kāi)始的,所以只要字符串中有匹配,就會(huì)導(dǎo)致死循環(huán)。當(dāng)時(shí)設(shè)置g后,會(huì)自動(dòng)改變前面的兩個(gè)屬性,會(huì)依次向后匹配直到?jīng)]有匹配項(xiàng)退出循環(huán)(調(diào)用lastIndex屬性要用正則表達(dá)式的對(duì)象)
輸出結(jié)果:
ab
ret.input=abcdef12ab34cd56ef
ret.index=0
RegExp.lastIndex =2
ab
ret.input=abcdef12ab34cd56ef
ret.index=8
RegExp.lastIndex =10
(3)exec返回的是類數(shù)組,match返回的也是類數(shù)組
我在原文的基礎(chǔ)上略作了修改。
總結(jié)
以上是生活随笔為你收集整理的javascript中match方法和exec()方法详解与深度区别(非原创)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CSS是什么及其继承与选择器
- 下一篇: JSDOM模型的样例