1.1 正則基礎
- 正則的含義:由特定的符號組成的具有特殊含義的代碼;
- 正則的目的:就是制定一些規(guī)則盖腿,來操作(校驗/匹配,捕獲)字符串的內容凤藏;只針對字符串;
- 正則的操作:
- 校驗:
reg.test(str)
堕伪,返回值為布爾值揖庄;如/^2\d{2}/.test(xml.status);
,校驗成功,滿足規(guī)則欠雌,就返回true,不滿足規(guī)則蹄梢,就返回false; - 捕獲:
reg.exec(str)
,返回值為一個數組;目的:用我制定的規(guī)則去捕獲字符串中的內容禁炒,有就以數組的形式拿出來而咆,沒有就返回null;
- 校驗:
- 字符串與正則配合的方法:
- match("在字符串中查找內容"): 使匹配,如果存在要查找的內容幕袱,則返回內容暴备,如果不存在,則返回null们豌;
- replace("被替換的內容","替換的內容"): 不會改變原字符串涯捻,返回一個新的字符串;
- search():搜索望迎,找到返回其下標值障癌,找不到返回-1;
- split(separator,limit):字符串轉換為新數組,原字符串不會發(fā)生改變辩尊;
- separator: 分離器涛浙,用于分割字符串的字符;即將其轉換為逗號摄欲;—可以取空字符“”轿亮;
- limit:可選參數,即分割幾次蒿涎,數值等于數組元素的個數哀托;
- 字符串方法代碼格式:
- str.match();
- str.replace();
- str.search();
- str.split();
- 正則的方法代碼格式:
- reg.test();
- reg.exec();
1.2 正則校驗(匹配)
- 校驗test()方法講解:
<script>
var reg=/圓夢源/;
//test:里面如果沒有進行限制,只要里面有我要的內容劳秋,都是true仓手;
console.log(reg.test("圓夢源"));//打印為true
console.log(reg.test("2322圓夢源dffd"));//打印為true
var reg2=/^圓夢源$/;
//test:"^"為開頭,"$"為結尾玻淑,意思是對內容進行了限制嗽冒,所以必須嚴格校驗;
console.log(reg2.test("圓夢源"));//打印為true
console.log(reg2.test("2322圓夢源dffd"));//打印為false
</script>
1.3 正則創(chuàng)建的方式
- 創(chuàng)建正則的方式分為兩種:字面量創(chuàng)建和實例創(chuàng)建
- 字面量創(chuàng)建:
var reg=/^2\d{2}/
;- 總結:字面量創(chuàng)建补履,斜杠中不加引號添坊,代表的就是字符串;斜杠中如果加引號箫锤,引號算一個字符贬蛙,代表自己的字符意義;注意谚攒,字面量創(chuàng)建中無法進行變量的拼接阳准;
//1.字面量創(chuàng)建,var reg=/str/馏臭,斜杠中不加引號野蝇,代表的就是字符串; var str="圓夢源"; var reg=/str/;//此處str指的是一個字符串"str";而不是變量str; console.log(reg.test("str"));//打印為true; console.log(reg.test("圓夢源"));//打印為false; //2.字面量創(chuàng)建中绕沈,斜杠中如果加引號锐想,引號算一個字符,代表自己的字符意義 var reg2=/"+str+"/;//此處的+號乍狐,是把前面的字符多寫幾個赠摇;"號,代表一個字符放在里面澜躺; console.log(reg2.test("str"));//打印為false; console.log(reg2.test("圓夢源"));//打印為false; console.log(reg2.test('""""strrrrr"'));//打印為true; console.log(reg2.test('dsfsfsd""""strrrrr"'));//打印為true;校驗不嚴格蝉稳,只要存在內容就行; //3.注意掘鄙,字面量創(chuàng)建中無法進行變量的拼接耘戚;
- 實例創(chuàng)建:
var reg=new RegExp(" ")
;- 總結:括號中必須加引號,才代表字符串操漠,如果不帶引號收津,就是變量;實例創(chuàng)建可以進行變量拼接浊伙;
//1.實例創(chuàng)建中撞秋,var reg=new RegExp("str"),括號中必須加引號,才代表字符串嚣鄙,如果不帶引號吻贿,就是變量; var str="圓夢源"; var reg3=new RegExp(str);//括號中不加引號哑子,就指的是變量舅列; console.log(reg3.test("圓夢源"));//打印為true; console.log(reg3.test("123圓夢源dfsd"));//打印為true; console.log(reg3.test("str"));//打印為false; //2. 實例創(chuàng)建中,括號里加引號卧蜓,此時指的就是字符串帐要,不再是變量; var str="圓夢源"; var reg4=new RegExp("str"); console.log(reg4.test('圓夢源'));//打印為false; console.log(reg4.test("str"));//打印為true; //3.實例創(chuàng)建可以進行變量拼接弥奸; var str="圓夢源"; var reg6=new RegExp("ti"+str+"an");//變量拼接 console.log(reg6.test("ti圓夢源an"));//打印為true;
- 字面量創(chuàng)建和實例創(chuàng)建的區(qū)別:
- 字面量創(chuàng)建無法拼接變量榨惠,實例創(chuàng)建可以拼接變量;
- 字面量創(chuàng)建不需要轉義盛霎,實例創(chuàng)建需要轉義赠橙,如“\d”等帶斜杠的元字符需要轉義,前面加一個斜杠愤炸;
var reg=/^2\d{2}$/;//字面量創(chuàng)建中期揪,特殊符號不需要轉義; console.log(reg.test("200"));//結果為true; var reg2=new RegExp("^2\\d{2}$");//實例創(chuàng)建中摇幻,特殊符號需要轉義横侦,如"\d"前面加"\"; console.log(reg2.test("200"));//結果為true;
- 字面量創(chuàng)建:
1.4 正則表達式的組成
- 正則表達式組成:由元字符和修飾符兩部分組成;如代碼:
var reg=/^2\d{2}/g
;- 元字符:就是包含在兩個斜杠之間的字符绰姻;
- 修飾符:就是斜杠外面的字符枉侧;
- 元字符:包含特殊含義的元字符和量詞元字符
- 特殊含義的元字符:1)\轉義;2)|或狂芋;3)()分組榨馁;4).除了\n以外的其他字符;5)\n 換行帜矾;6)\b 開頭結尾和空格翼虫;7)^開頭;8)$結尾 9)\s 空格屡萤;10)\S 非空格珍剑;11)\d 數字 12)\D 非數字;13)\w數字死陆,字母招拙,下劃線; 14)\W 非數字措译,字母别凤,下劃線;15)[a-z]a到z之間的小寫字母领虹; 16)[^a-z] 非a到z之間的小寫字母规哪; 17)[abc] 包含abc三個字母中的任何一個,只能是一個塌衰; 18)[^abc] 除了abc三個字母诉稍;
- 量詞元字符:1)* 0到多次; 2)+ 1到多次猾蒂; 3)? 0或1均唉; 4){n} 正好n次; 5){n,} 最少n次肚菠;n次到多次舔箭; 6){n,m} n次到m次;
- 修飾符:1)g 全局蚊逢; 2)m 換行层扶; 3) i 忽略大小寫;
- 知識點:
- 小括號的用法:
- 提高優(yōu)先級:
/^(18|19)$/
;驗證18或19烙荷;
//目的:驗證18或19 var reg=/^18|19$/;//分析:1加8或1加9镜会,以1開頭,以9結尾终抽; console.log(reg.test("18219"));//結果為true; console.log(reg.test("119"));//結果為true; //注意:當使用|的時候必須加小括號戳表; //正確寫法: var reg1=/^(18|19)$/; console.log(reg1.test("189"));//結果為false; console.log(reg1.test("18"));//結果為true;
- 分組的作用桶至;
- 小分組的作用;用于exec捕獲匾旭;
- 提高優(yōu)先級:
- 中括號的用法:
- 中括號[]的用法:中括號中不會出現(xiàn)兩位數镣屹;只能出現(xiàn)一個;
//[abc]意思是abc中的任何一個价涝;不會出現(xiàn)兩個女蜈; var reg=/^[11-89]$/;//分析:1或1-8或9,三者中的任何一個 console.log(reg.test("1"));//結果為true; console.log(reg.test("6"));//結果為true;6在1-8之間色瘩; console.log(reg.test("11"));//結果為false;11不在三者之間伪窖;
- 中括號[]里面的字符意義會發(fā)生改變,分為兩種居兆,
- 如"+","."這些元字符覆山,代表加,小數點泥栖;都不用加轉義符汹买;但是在其他的時候必須加轉義符才能代表加,小數點的意思聊倔;
- 對比1:
[+-]
指的是+或-晦毙,二者任何一個;此時中括號中的+號耙蔑,不用加轉義符见妒,就代表加號的含義; - 對比2:
(\+|-)
指的是+或-甸陌,二者任何一個须揣;此時在小括號中的+號需要添加轉義符;才代表加號的含義钱豁;
- 對比1:
- 如"\w","\s","\d"這些元字符耻卡,帶斜杠的仍然代表元字符的含義;
- 如"+","."這些元字符覆山,代表加,小數點泥栖;都不用加轉義符汹买;但是在其他的時候必須加轉義符才能代表加,小數點的意思聊倔;
- 中括號[]的用法:中括號中不會出現(xiàn)兩位數镣屹;只能出現(xiàn)一個;
- 中括號和小括號的共同點:是在使用或的時候牲尺,功能是一樣的卵酪;都代表兩者其一丈屹;
- 中括號:
[ab]
指的就是a,b二者中任何一個季俩; - 小括號:
(a|b)
指的也是a,b二者中任何一個历谍; - 弊端:當a尚蝌,b為數字時,必須是一位數時拉宗,才能用中括號代赁,如果為兩位數缆镣,只能用小括號搓茬;如
[1234]
代表的意思是1234四位數中的任何一個數犹赖;而(12|34)
代表的是12或34队他; - 注意:盡量不要用小括號,因為在exec方法捕獲時峻村,會對小括號進行小分組漱挎;會導致錯亂;可以通過添加"?:"來解決雀哨,只匹配不捕獲;
- 中括號:
- 量詞元字符"?"問號的用法:
- 代表可有可無;如有效數字正則表達式中的使用私爷;
- 放在正則捕獲中的量詞元字符后面雾棺,添加后,來解決正則捕獲的貪婪性衬浑;如捕獲數字時捌浩,只捕獲一個數字時的使用;
- 小括號的用法:
1.5 正則表達式實際應用
- 有效數字的正則表達式
- 代碼:
var reg=/^[+-]?(((\d)|([1-9]\d+))(\.\d+)?)$/
或var reg=/^(\+|-)?(((\d)|([1-9]\d+))(\.\d+)?)$/
(其中加號要用轉義符); - 解讀:
-
^
指開頭工秩,$
指結尾 -
+
和-
都可以尸饺,所以用[+-]
,可有可無助币,用?
- 數字分為整數和小數,用
()()
- 整數分為兩種浪听,一位數,兩位數或更多眉菱;所以用或迹栓,即
()|()
; - 一位數()可以是0-9之間的任何一個數,所以用
\d
; - 兩位數或多位數俭缓,第一位不能是0,所以需要1-9之間的數字克伊,用
[1-9]
;第二位可以是0-9之間的數字,用\d
,可以是三位數或更多位华坦,用+
; - 小數可有可無愿吹,用
?
;小數中分為小數點和數字惜姐,其中小數點用轉義符\.
來組合犁跪,數字可以是0-9之間的任何數字,所以用\d
,可以是多位數歹袁,用+
;
-
- 代碼:
- 電話號碼的正則表達式
- 代碼:
var reg=/^1\d{10}$/
- 解讀:
^1
指以1開頭耘拇,\d
指0-9之間的數字,{10}
指正好10位數字宇攻,$
指結尾惫叛;
- 代碼:
- 郵箱的正則表達式
- 代碼:
var reg=/^([\w.-]+)@([a-zA-Z0-9]+)((\.[a-zA-Z]{2,4}){1,2})$/
- 分析:郵箱可能出現(xiàn)的情況:zhan233f_sdi-dfjeif.djife @ qq/163 .com/.cn/.blog
- 解讀:
- 郵箱分為四部分
- 第一部分:@前面的部分。有可能出現(xiàn)的情況:小寫字母a-z逞刷;大寫字母A-Z嘉涌;數字0-9妻熊;下劃線_;符號-仑最;符號.
- 用
[\w.-]+
表示上面出現(xiàn)的情況扔役;- 其中“小寫字母a-z;大寫字母A-Z警医;數字0-9亿胸;下劃線_;”预皇,用
\w
表示侈玄; - 其中“符號-;符號.”吟温,用
[.-]
表示序仙,中括號的意思是三者出現(xiàn)任何一個; -
+
的意思是可以出現(xiàn)1到多個鲁豪;
- 其中“小寫字母a-z;大寫字母A-Z警医;數字0-9亿胸;下劃線_;”预皇,用
- 用
- 第二部分:
@
符號潘悼,直接字符串拼接; - 第三部分:qq或QQ或163或者其他爬橡,但是包括小寫字母a-z治唤;大寫字母A-Z;數字0-9糙申;不包括下劃線肝劲,所以不能用
\w
;-
[a-zA-Z0-9]
指的就是“小寫字母a-z;大寫字母A-Z郭宝;數字0-9”辞槐; -
+
指的是可以出現(xiàn)1到多次;
-
- 第四部分:“.com/.cn/.blog”粘室,其中可能出現(xiàn)".com"或".com.cn"或".com.blog"三種情況
- 先創(chuàng)建".com或.cn或.blog"榄檬,
\.
代表小數點,[a-zA-Z]
代表所有的大小寫字母衔统,{2,4}
指的是字母出現(xiàn)的次數只能在2到4之間鹿榜;不能是+
; - 所以
(\.[a-zA-Z]{2,4})
代表的是".com或.cn或.blog"; -
{1,2}
指的是".com或.cn或.blog"出現(xiàn)的次數锦爵,只能出現(xiàn)1到2次舱殿;如".com"或".com.cn"或".com.blog"三種情況
- 先創(chuàng)建".com或.cn或.blog"榄檬,
- 驗證代碼:
var reg=/^([\w.-]+)@([a-zA-Z0-9]+)((\.[a-zA-Z]{2,4}){1,2})$/; console.log(reg.test("135865985@qq.com"));//結果為true; console.log(reg.test("135865985@163.com.cn"));//結果為true; console.log(reg.test("135865985@qq.com.blog"));//結果為true; console.log(reg.test("135865985@qq.com.blogg"));//結果為false;因為.blogg位數超過四位;
- 代碼:
- 中文的正則表達式
- 第一個漢字:“一”,代碼:
\u4e00
; - 最后一個漢字:“龥”险掀,代碼:
\u9fa5
; - 實例:二到四位的漢字沪袭;代碼:
var reg=/^[\u4e00-\u9fa5]{2,4}$/
- 第一個漢字:“一”,代碼:
- 數字18到65之間的正則表達式
- 分析:將其分解為三部分,18-19,20-59,60-65
- 代碼:
var reg=/^((18|19)|([2-5]\d)|(6[0-5]))$/
;注意:有或出現(xiàn)必須加小括號樟氢; - 解讀:
-
(18|19)
指18或19之間一個數冈绊; -
[2-5]\d
指第一位為2到5之間侠鳄,第二位為0-9之間數字; -
6[0-5]
指第一位為6死宣,第二位為0-5之間的數字伟恶;
-
- 身份證號碼的正則表達式
- 簡單的正則表達式
- 分析:身份證總共18位,最后一位可能是數字也可能是字母X
- 知識點:小括號與中括號中解決或的問題的方法,以及使用小括號的弊端毅该;
- 代碼:
var str="130216192305253234"; var reg=/^\d{17}(\d|X)$/; console.log(reg.exec(str));//結果為:["130216192305253234", "4", index: 0, input: "130216192305253234", groups: undefined] //此時用exec會出現(xiàn)問題博秫,當用到或的時候,需要用小括號眶掌,但是在exec中會把小括號作為小分組挡育,拿出來;所以會多一項"4"畏线; var reg1=/^\d{17}[\dX]$/; //避免使用小括號,可以使用中括號良价,來解決或的問題寝殴; console.log(reg1.exec(str));//結果為:["130216192305253234", index: 0, input: "130216192305253234", groups: undefined]
- 獲取詳細信息的正則表達式
- 分析:身份證號碼每一位都有其含義,所以需要小分組將其分別獲取明垢,分類如:兩位省蚣常,四位市縣,四位年痊银,兩位月抵蚊,兩位日,后四位(分為兩位戶口所在地編碼溯革,一位奇偶性別贞绳,最后一位根據前面17位計算出來代表個人信息的)
- 代碼:
var str="130216192305253234"; var reg2=/^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|X)$/; console.log(reg2.exec(str));//結果為:["130216192305253234", "13", "0216", "1923", "05", "25", "32", "3", "4", index: 0, input: "130216192305253234", groups: undefined];
- 簡單的正則表達式
1.6 正則捕獲
- 正則中的捕獲,主要講三個方法:
- exec: reg.exec(str);——正則的方法致稀;
- match: str.match(reg);——字符串的方法冈闭;
- replace: str.replace(reg,xxxx);——字符串的方法;
1.6.1 正則exec方法解讀
- 定義:exec是正則的方法抖单,每次捕獲只能捕獲一個滿足正則的內容萎攒,然后返回的結果是個數組,默認情況下矛绘,數組有4項:
- 第一項:符合大正則的內容耍休;(包含小分組內容)
- 第二項:如果存在小分組,則第二項內容為小分組的內容货矮;如果存在多個小分組羊精,那么會依次類推到第三項等等;
- 第三項:index:對應的值為查找到的內容開始字符所對應的索引囚玫;(位置)
- 第四項:input:原始字符串园匹;
- 代碼:
var str="huadianxiehe2018zhanwang2019huigu2017huadianxiehe2015"; var reg=/huadianxiehe(\d+)/g;//此時()為小分組雳刺,所以得到的數組中第二項為小分組內容; console.log(reg.exec(str));//結果為:["huadianxiehe2018", "2018", index: 0, input: "huadianxiehe2018zhanwang2019huigu2017huadianxiehe2015", groups: undefined] console.log(reg.exec(str));//結果為:["huadianxiehe2015", "2015", index: 37, input: "huadianxiehe2018zhanwang2019huigu2017huadianxiehe2015", groups: undefined]
- 正則捕獲有兩大特點:
- 懶惰性:每次找的時候都是從0開始找裸违;
- 解決措施:添加修飾符全局g掖桦;目的使其按順序找;需注意:當查找到最后一個滿足條件的表達式后供汛,會輸出null枪汪,然后再查找的時候,會重頭開始查找怔昨,無限循環(huán)雀久;
- 知識點:修飾符g的作用,以及exec捕獲的方式和返回的數組形式趁舀;
- 代碼對比:
<script> var str="huadianxiehe2018zhanwang2019huigu2017"; //1.不添加全局g赖捌,每次查找時,都從0開始查找矮烹; var reg=/\d+/; console.log(reg.exec(str));//結果為:["2018", index: 12, input: "huadianxiehe2018zhanwang2019huigu2017", groups: undefined] console.log(reg.exec(str));//結果為:["2018", index: 12, input: "huadianxiehe2018zhanwang2019huigu2017", groups: undefined] //2. 添加全局g越庇,每次按順序向后找,需注意:當查找到最后一個滿足條件的表達式后奉狈,會輸出null卤唉,然后再查找的時候,會重頭開始查找仁期,無限循環(huán)桑驱; var reg=/\d+/g; console.log(reg.exec(str));//結果為:["2018", index: 12, input: "huadianxiehe2018zhanwang2019huigu2017", groups: undefined] console.log(reg.exec(str));//結果為:["2019", index: 24, input: "huadianxiehe2018zhanwang2019huigu2017", groups: undefined] console.log(reg.exec(str));//結果為:["2017", index: 33, input: "huadianxiehe2018zhanwang2019huigu2017", groups: undefined] console.log(reg.exec(str));//結果為:null; console.log(reg.exec(str));//結果為:["2018", index: 12, input: "huadianxiehe2018zhanwang2019huigu2017", groups: undefined] </script>
- 貪婪性:在正則代碼中添加"+"號后,就會把所有的輸出來跛蛋,所以比較貪婪熬的;
- 解決措施:在量詞元字符"+"后面,添加量詞元字符"?"赊级;
- 知識點:量詞元字符"?"的應用
- 代碼對比:
var str="huadianxiehe201823243zhanwang2019huigu2017"; var reg=/\d+/g; console.log(reg.exec(str));//結果為:["201823243", index: 12, input: "huadianxiehe201823243zhanwang2019huigu2017", groups: undefined] //分析:添加+號后悦析,exec會一下將201823243全部拿出來,顯示貪婪此衅; var reg1=/\d+?/g; console.log(reg1.exec(str));//結果為:["2", index: 12, input: "huadianxiehe201823243zhanwang2019huigu2017", groups: undefined] console.log(reg1.exec(str));//結果為:["0", index: 13, input: "huadianxiehe201823243zhanwang2019huigu2017", groups: undefined] //分析:在+號后面添加?號强戴,會解決它的貪婪性,讓其每次都輸出一個數字挡鞍; //修改:如果想要達到捕獲的目的骑歹,一個一個數字的獲取,正則表達式可以寫成 reg=/\d/g;
- 懶惰性:每次找的時候都是從0開始找裸违;
- 正則屬性方法:
- lastIndex屬性:
- 屬性值:若正則表達式中在未添加全局g時墨微,每次exec捕獲都從0開始道媚,此時的lastIndex值都是0;
- 屬性值:若正則表達式中添加全局g后,指最后一次exec捕獲內容后最域,開始下一次捕獲時谴分,開始查找的字符位置的索引值;需注意:當查找到最后一個滿足條件的表達式后镀脂,會輸出null牺蹄,此時lastIndex值為0;繼續(xù)查找薄翅,就會重頭開始查找沙兰,無限循環(huán);
- 代碼:
<script> var str="huadianxiehe201823243zhanwang2019huigu2017"; var reg=/\d+/g; console.dir(reg); console.log(reg.lastIndex);//結果為:0翘魄; console.log(reg.exec(str));//結果為:["201823243", index: 12, input: "huadianxiehe201823243zhanwang2019huigu2017", groups: undefined] console.log(reg.lastIndex);//結果為:21鼎天; console.log(reg.exec(str));//結果為:["2019", index: 29, input: "huadianxiehe201823243zhanwang2019huigu2017", groups: undefined]; console.log(reg.lastIndex);//結果為:33暑竟; console.log(reg.exec(str));//結果為:["2017", index: 38, input: "huadianxiehe201823243zhanwang2019huigu2017", groups: undefined]斋射; console.log(reg.lastIndex);//結果為:42; console.log(reg.exec(str));//結果為:null但荤; console.log(reg.lastIndex);//結果為:0罗岖; //當查找完后,會重復查找纱兑; console.log(reg.exec(str));//結果為:["201823243", index: 12, input: "huadianxiehe201823243zhanwang2019huigu2017", groups: undefined]呀闻; console.log(reg.lastIndex);//結果為:21化借; </script>
- lastIndex屬性:
- 實例1
- 需求:獲取字符串中所有的數字潜慎,組成一個數組
- 代碼:
<script> var str="huadianxiehe2018zhanwang2019huigu2017"; var reg=/\d+/g; var ary=[]; var res=reg.exec(str); while(res){ ary.push(res[0]); res=reg.exec(str);//注意:必須重新賦值,然后再判斷蓖康; } console.log(ary);//結果為:["2018", "2019", "2017"]铐炫; </script>
1.6.2 字符串match方法解讀
- 定義:是字符串的方法,每次能得到所有符合正則的內容蒜焊,并且以一個新數組的形式返回倒信;如果沒有符合規(guī)則的內容,返回null;
- 代碼:
var str="huadianxiehe2018zhanwang2019huigu2017huadianxiehe2015"; var reg=/\d+/g; console.log(str.match(reg));//結果為:["2018", "2019", "2017", "2015"]泳梆;
1.6.3 exec方法與match方法的區(qū)別
- exec方法與match方法的區(qū)別:
- exec方法是RegExp類原型上的方法鳖悠;match方法是字符串原型上的方法;
- exec方法和match方法优妙,在查找的時候乘综,正則表達式中,如果不添加全局g套硼,則兩個方法拿到的結果是相同的卡辰,都是一個數組,里面有三項;
- exec方法每次只能拿到一個值九妈;match方法能拿到所有值(前提是正則表達式中添加全局g)反砌,并以新數組的形式返回;針對的都是字符串萌朱;
- exec方法既能拿到大正則宴树,也能拿到小分組;match方法只能拿到大正則嚷兔,無法拿到小分組森渐;
- 實例:利用exec方法實現(xiàn)match功能
<script> var str="huadianxiehe2018zhanwang2019huigu2017"; var reg=/\d+/g; //需求:利用exec方法實現(xiàn)match功能 //第一反應:match方法是誰的方法?——字符串String類原型prototype上的公有屬性; //第二反應:match方法中的this是誰?——this指向字符串實例冒晰; //第三反應:match方法有什么功能同衣,如何用exec方法去封裝; //分析:match方法作用是壶运,獲取str中所有滿足正則表達式reg要求的內容耐齐,作為數組元素,返回一個數組蒋情; //進而就決定了函數的參數是reg表達式埠况,返回值為數組,函數中this指向字符串實例棵癣; String.prototype.Match=function (Reg) { //此時this指向字符串實例,所以就可以用this來代表外面的字符串 //1.先拿到第一次的exec返回值辕翰; var ary=[]; var ree=Reg.exec(this); //2.通過while循環(huán)依次往數組中放我們找到的值,當沒有找到時狈谊,會返回null喜命; while(ree){ ary.push(ree[0]); ree=Reg.exec(this); } //3.返回值; return ary;//此時如果不添加返回值河劝,會默認返回this實例對象壁榕,此處添加返回值為數組對象,引用數據類型赎瞎,會重新賦值數組新地址牌里; }; var res=str.Match(reg); console.log(res); </script>