這篇文章給大家介紹在JavaScript中使用pattern時(shí)需要注意哪些事項(xiàng),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
創(chuàng)新互聯(lián)建站-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比高臺(tái)網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式高臺(tái)網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋高臺(tái)地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴(lài)。
RegExp對(duì)象的創(chuàng)建:
常規(guī)的正則表達(dá)式的創(chuàng)建可用直接量,即斜杠 “/” 括起來(lái)的字符。但在要求參數(shù)變化的環(huán)境下,RegExp()構(gòu)造函數(shù)是更好的選擇:
var reg1 = /'\w+'/g; var reg2 = new RegExp('\'\\w+\'','g');
對(duì)比兩種創(chuàng)建方式,RegExp中的第一個(gè)參數(shù)為要?jiǎng)?chuàng)建的正則字符串,一方面注意,因?yàn)椴皇侵苯恿康谋硎拘问剑虼瞬挥眯备堋?/ ”括起來(lái)了;而是字符串中必須要對(duì)引號(hào)“ ‘ ”和轉(zhuǎn)義符號(hào)“ \ ”進(jìn)行二次轉(zhuǎn)義。
此外,無(wú)論是直接量還是RegExp()構(gòu)造函數(shù),都是生成了新的RegExp對(duì)象,并將其賦值給變量。
在《Javascript權(quán)威指南》一書(shū)中講到,對(duì)于正則表達(dá)式的直接量,ECMAscript 3規(guī)定在每次它時(shí)都會(huì)返回同一個(gè)RegExp對(duì)象,因此用直接量創(chuàng)建的正則表達(dá)式的會(huì)共享一個(gè)實(shí)例。直到ECMAScript 5才規(guī)定每次返回不同的實(shí)例。
各瀏覽器中,IE一直遵守ECMAScript 5中的規(guī)定,其他瀏覽器的較老版本則遵循ECMAScript 3的規(guī)定。因此在實(shí)際應(yīng)用中,采取構(gòu)造函數(shù)創(chuàng)建的方法比較安全,或者在使用lastIndex屬性時(shí)要記得歸0。
括號(hào)()的使用:
1、分組
即把單獨(dú)項(xiàng)組合成子表達(dá)式統(tǒng)一處理,一般用于?、+、*、{n,m}等的重復(fù)處理。見(jiàn)例子:
var reg = /Java(script)?/;
式子里將script進(jìn)行統(tǒng)一處理。
2、向后引用
即在正則表達(dá)式中用“\n”(n代表引用的序號(hào))引用式中前面括號(hào)中匹配的文本。見(jiàn)例子:
var reg = /(\d+)[a-z]{3}\1/; //20man20 //20man23 錯(cuò) //reg = /\1[a-z]{3}(\d+)/; 錯(cuò)
注意 “\n”引用的是前面匹配的文本" 20 ",而不是匹配的正則表達(dá)式" \d+ "。另外,JS里只能引用前面的匹配文本,像例子中的將 \1寫(xiě)在括號(hào)引用的前面,將不會(huì)匹配到任何文本,瀏覽器中會(huì)提示出錯(cuò)。同樣,JS里也不支持類(lèi)似“ (?<name>exp) ”(exp為正則字符)的引用命名規(guī)則,只支持?jǐn)?shù)字的引用。
既然提到了分組和引用,如果只想進(jìn)行分組,而不想引用,則可用 "(?: exp)"的形式,既不匹配文本,也不給引用編號(hào)。見(jiàn)例子:
var reg = /(\w{3})(?:\d+)([a-z]{2})\2/; //man7788abab
顯然 \2 匹配的是 "ab" 而不是 "7788" 。這樣便于分組處理,也加快了查詢(xún)的效率。
3、子模式匹配
有時(shí)我們想直接引用操作括號(hào)匹配的本文,那么可以用子模式匹配的功能(權(quán)威指南里叫子模式匹配,有點(diǎn)別扭,實(shí)際就是用一個(gè)變量形式替換匹配的文本)。基本形式是用 '$n'的形式替代匹配編號(hào)為n的文本,常用在String對(duì)象里的replace()方法,見(jiàn)例子,等號(hào)兩邊交換單詞:
var reg = /(\w+)=(\w+)/; var str = ‘love=hate'; str.replace(reg,'$2=$1'); //"hate=love"
次序、貪婪、懶惰:
一般的重復(fù)匹配字符如?、+、*、{n,m}在匹配的過(guò)程中,采用貪婪匹配的方法,即盡可能多的匹配到結(jié)果字符。與之對(duì)應(yīng)的是懶惰匹配,即盡可能少的匹配結(jié)果,使用形式只需在重復(fù)匹配字符后加上問(wèn)號(hào)" ? "即可,如??、+?、*?、{n,m}?。見(jiàn)例子:
var str = 'goooogle‘; var reg1 = /o+/; //"goooo" var reg2 = /o+?/; //"go"
現(xiàn)在對(duì)例子稍加改動(dòng):
var str = 'goooogle‘; var reg1 = /o+gle/; //"oooogle" var reg2 = /o+?gle/; //"oooogle"
改過(guò)后的例子結(jié)果變?yōu)橄嗤?,為什?/o+?gle/ 沒(méi)有匹配到“ogle”呢?原來(lái)正則表達(dá)式中總是從左往右進(jìn)行匹配的,不會(huì)從右邊獲取子串進(jìn)行匹配。
雖然上面的結(jié)果相同,但匹配的原理不太一樣。在reg1中,首先o+會(huì)匹配所有的"o",然后接著匹配"gle",從而完成整體匹配。而在reg2中,o+?會(huì)先匹配一個(gè)"o",然后gle在字符串的第2位到第4位(即原串的"ooo")匹配失敗。進(jìn)而回溯至o+?去匹配第二個(gè)"o",成功后再在第3位到第4位匹配"gle",以此類(lèi)推……最后匹配到整個(gè)字符串。
總體要記住,從優(yōu)先級(jí)來(lái)說(shuō),從左往右的次序匹配 > 貪婪 / 懶惰匹配。
零寬斷言:
關(guān)于零寬斷言的總體解釋可參考博文《正則表達(dá)式30分鐘入門(mén)教程》,值得注意的是,JS里只支持零寬先行斷言。即零寬正預(yù)測(cè)先行斷言"(?=exp)"和零寬負(fù)預(yù)測(cè)先行斷言“(?!exp)"。
所謂“零寬”,就是它并不在匹配的結(jié)果字符中占據(jù)空間。例如“\w","\s"就會(huì)占據(jù)一個(gè)或幾個(gè)空間,依匹配的字符長(zhǎng)度決定。而像”^","$"這種對(duì)應(yīng)的首末位置,不占據(jù)空間,零寬就是屬于這一類(lèi)。
所謂“正 / 負(fù)預(yù)測(cè)”,是指斷言中要求滿(mǎn)足的情況?!罢北硎疽獫M(mǎn)足exp,“負(fù)”表示要不滿(mǎn)足exp的。
所謂"先行",是指被匹配的字符串在前面,零寬斷言跟在后面。即串的后一部分是否滿(mǎn)足斷言。
所謂“斷言”,就是判斷的條件。
看兩種零寬斷言的例子:
var str = 'java coffeescript'; var reg1 = /\b\w+(?=script\b)/; //coffee var reg2 = /\b\w+(?!script\b)/; //java
reg1為零寬正預(yù)測(cè)先行斷言,"(?=script\b)"表示某單詞需以“script”結(jié)尾,它代表著一種條件,不占有任何空間大小。
同樣,reg2為零寬負(fù)預(yù)測(cè)先行斷言,"(?!script\b)"表示不以“script”結(jié)尾的單詞。
另外,因?yàn)闆](méi)有零寬后顧斷言,不能判斷某字符串的前面部分滿(mǎn)足什么條件。但在JS中可以用多次正則表達(dá)式來(lái)實(shí)現(xiàn):先匹配到要找的串,然后截取開(kāi)頭到index的字符子串,再匹配子串末尾是否符合需要的斷言條件。具體用法可另外嘗試一下。
match()與exec()的異同:
match和exec是正則表達(dá)式匹配字符串的常用方法。兩者實(shí)現(xiàn)的功能差不多,有些細(xì)微的區(qū)別:
1、使用方式
match是字符串包裝對(duì)象的方法,用法:String.match(RegExp);
exec是正則表達(dá)式對(duì)象的方法,用法:RegExp.exec(String);
2、返回的結(jié)果
當(dāng)RegExp沒(méi)有設(shè)置全局標(biāo)志 "g" 時(shí):
兩者的返回結(jié)果相同。即無(wú)匹配值時(shí)返回null,有匹配值時(shí)返回一個(gè)數(shù)組(令array)。array[0]為匹配的字符串,array[1]、array[2]……則對(duì)應(yīng)為正則表達(dá)式中圓括號(hào)匹配的子字符串$1、$2……。同時(shí)數(shù)組帶有兩個(gè)屬性,array.index表示匹配字符串的初始位置,array.input表示正在檢索的字符串。
當(dāng)RegExp有設(shè)置全局標(biāo)志 "g" 時(shí):
match在有值時(shí)返回一個(gè)數(shù)組array。數(shù)組的每項(xiàng)依次表示匹配到的所有的字符串,因此不再有圓括號(hào)匹配的子字符串了。此時(shí)數(shù)組沒(méi)有index屬性和input屬性。
exec則與沒(méi)有全局標(biāo)示 "g" 的表現(xiàn)無(wú)異。此時(shí)返回的是數(shù)組array,array[0]為當(dāng)前匹配的字符串,array[1],array[2]……則為當(dāng)前匹配下的圓括號(hào)匹配的字串。此時(shí)要注意RegExp對(duì)象的lastIndex屬性,表示原字符串中匹配的字符串末尾的后一個(gè)位置。當(dāng)沒(méi)有進(jìn)一步的匹配結(jié)果時(shí),lastIndex屬性置0。因此,可用lastIndex的循環(huán)找出所有的匹配字符串。來(lái)看看例子:
var str = 'I love1 my job22'; var reg = /\b[a-z]+(\d+)\b/g; array = str.match(reg); //array = ["love1", "job22"] //array.index = undefind //array.input = undefined ------------------------------------ array = reg.exec(str); //array = ["love1", "1"] //array.index = 2 //array.input = "I love1 my job22" //reg.lastIndex = 7 //run again reg.exec(str); //array = ["job22", "22"] //array.index = 11 //array.input = "I love1 my job22" //reg.lastIndex = 16 //run again reg.exec(str); //reg.lastIndex = 0
最后,考慮到ECMAScript 3 和ECMAScript 5的版本區(qū)別,每次匹配完之后記得要手動(dòng)將RegExp對(duì)象的lastIndex屬性置0,以滿(mǎn)足老非IE瀏覽器的要求。
js正則表達(dá)式,pattern,注意事項(xiàng)
一句話(huà),請(qǐng)使用,/\w+@+\w+(\.+\w+){1,}/.test(str) 來(lái)驗(yàn)證,不要用"\w+@+\w+(\.+\w+){1,}".test(str) 來(lái)驗(yàn)證;
使用后者,直接,用add@dfddf 就可以通過(guò)驗(yàn)證了;
關(guān)于在JavaScript中使用pattern時(shí)需要注意哪些事項(xiàng)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
分享文章:在JavaScript中使用pattern時(shí)需要注意哪些事項(xiàng)
標(biāo)題鏈接:http://muchs.cn/article24/gcicje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、動(dòng)態(tài)網(wǎng)站、靜態(tài)網(wǎng)站、、面包屑導(dǎo)航、小程序開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)