本文實(shí)例講述了JavaScript引用類型RegExp基本用法。分享給大家供大家參考,具體如下:
1、正則表達(dá)式定義
三個(gè)標(biāo)志:全局模式g,不區(qū)分大小寫模式i,多行模式m。
1) 字面量定義
var pattern = /[fe]at/gim;
2) 構(gòu)造函數(shù)定義:
接收兩個(gè)參數(shù)——要匹配的字符串模式和可選的模式字符串(g,i,m)。
var pattern = new RegExp("[fe]at","gim");
注意:
1) 若需要匹配的字符串中包含以下元字符,就必須對(duì)它們進(jìn)行轉(zhuǎn)義:( [ { \ ^ & | ) ? * + . ] } 。
2) 由于構(gòu)造函數(shù)定義正則表達(dá)式的參數(shù)是字符串,所以在某些情況下要對(duì)字符時(shí)行雙重轉(zhuǎn)義如\n,字符\在字符串中通常被轉(zhuǎn)義為\\,而在正則表達(dá)式字符串參數(shù)中就會(huì)變成\\\\,字面量模式/\w\\hello\\123/等價(jià)的字符串為“\\w\\\\hello\\\\123”。
2、RegExp實(shí)例屬性
var pattern = new RegExp("\\[fe\\]at","i"); alert(pattern.source);
以上代碼返回\[fe\]at
3、RegExp實(shí)例方法
1) 繼承的toLocaleString()
、toString()
、valueOf()
方法
toLocaleString()
:返回正則表達(dá)式的字面量,與創(chuàng)建正則表達(dá)式的方式無(wú)關(guān)。
toString()
:返回正則表達(dá)式的字面量,與創(chuàng)建正則表達(dá)式的方式無(wú)關(guān)。
valueOf()
:返回正則表達(dá)式本身。
var pattern1 = /\[fe\]at/i); var pattern2 = new RegExp("\\[fe\\]at","i"); alert(pattern1.toString()); // /\[fe\]at/i alert(pattern1.toLocaleString()); // /\[fe\]at/i alert(pattern2.toString()); // /\[fe\]at/i alert(pattern2.toLocaleString()); // /\[fe\]at/i
2) match()
方法
參數(shù):用于匹配的正則表達(dá)式。
返回值:區(qū)分match()
的返回值主要是看是否設(shè)置g標(biāo)志,沒有設(shè)置g標(biāo)志時(shí)與exec()
是等價(jià)的。
a. 如果設(shè)置g標(biāo)志,那么返回的是包含所有匹配項(xiàng)的數(shù)組。
b. 如果沒有設(shè)置g標(biāo)志,那么返回的是包含第一個(gè)匹配項(xiàng)的數(shù)組,第0項(xiàng)是與整個(gè)正則表達(dá)式匹配的字符串,第1項(xiàng)是是與第1個(gè)子表達(dá)式相匹配的文本(如果有的話),第2項(xiàng)是與第2個(gè)子表達(dá)式相匹配的文本(如果有的話)。
3) exec()
方法
參數(shù):要應(yīng)用模式的字符串。
返回值:返回包含第一個(gè)匹配項(xiàng)信息的數(shù)組,沒有匹配項(xiàng)的情況下返回null。exec()
的返回值不受g標(biāo)志影響,在不設(shè)置g標(biāo)志時(shí),在同一個(gè)字符串上多次調(diào)用exec()
將會(huì)始終返回第一個(gè)匹配項(xiàng)的信息。即使設(shè)置了g標(biāo)志,一次也只返回一個(gè)匹配項(xiàng),但設(shè)置g標(biāo)志時(shí),每次調(diào)用exec()
都會(huì)在字符串中繼續(xù)查找新匹配項(xiàng),會(huì)驅(qū)動(dòng)lastIndex可以模擬遍歷所有匹配,可以與match()
設(shè)置g標(biāo)志時(shí)等價(jià)(區(qū)別在于遍歷所有匹配時(shí),exec()
需要多次匹配,match()
一次匹配即可得到所有匹配)。
返回的數(shù)組包含額外的兩個(gè)屬性:index和input。其中,index表示匹配項(xiàng)在字符串中的位置,而input表示應(yīng)用正則表達(dá)式的字符串。在數(shù)組中,第0項(xiàng)是與整個(gè)正則表達(dá)式匹配的字符串,第1項(xiàng)是是與第1個(gè)子表達(dá)式相匹配的文本(如果有的話),第2項(xiàng)是與第2個(gè)子表達(dá)式相匹配的文本(如果有的話)。
var str = "Shanghai and Beijing and Guangzhou"; var pattern = /Shanghai ( and Beijing ( and Guangzhou)?)?/gi; var match = pattern.exec(str); alert(match.index);//0 alert(match.input);//"Shanghai and Beijing and Guangzhou" alert(match[0]);//"Shanghai and Beijing and Guangzhou" alert(match[1]);//"and Beijing and Guangzhou" alert(match[2]);//"and Guangzhou"
在不設(shè)置g標(biāo)志的情況下,同一個(gè)字符串上調(diào)用exec()
始終返回第一個(gè)匹配項(xiàng)的信息。
var str = "fat eat"; var pattern = /.at/; var match = pattern.exec(str); alert(match.index);//0 alert(match.input);//fat eat alert(match[0]);//fat alert(pattern.lastIndex);//0 var match = pattern.exec(str); alert(match.index);//0 alert(match.input);//fat eat alert(match[0]);//fat alert(pattern.lastIndex);//0
設(shè)置全局標(biāo)志g情況下,同一個(gè)字符串上調(diào)用exec()每次會(huì)返回一個(gè)新的匹配項(xiàng)的信息。
var str = "fat eat"; var pattern = /.at/g; var match = pattern.exec(str); alert(match.index);//0 alert(match.input);//fat eat alert(match[0]);//fat alert(pattern.lastIndex);//3 var match = pattern.exec(str); alert(match.index);//4 alert(match.input);//fat eat alert(match[0]);//eat alert(pattern.lastIndex);//7
4) test()
方法
參數(shù):要應(yīng)用模式的字符串
返回值:在模式與該參數(shù)匹配的情況下返回true,否則返回false。
test()
方法經(jīng)常用于if語(yǔ)句中。
問題:
如果正則表達(dá)式帶有標(biāo)志g,使用test校驗(yàn)不同的字符串時(shí),RegExp會(huì)使用test前一個(gè)字符串得出的lastIndex去test后一個(gè)字符串,必定出錯(cuò)。
var pattern = /^[1-9]\d{4,10}$/gi; var str = "88888"; alert(pattern.test(str));//返回true str = "888888"; alert(pattern.test(str));//返回false
解決方法:
① 將正則表達(dá)式的 lastIndex 屬性設(shè)置為0 再用作校驗(yàn)
var pattern = /^[1-9]\d{4,10}$/gi; var str = "88888"; alert(pattern.test(str));//返回true str = "888888"; pattern.lastIndex=0; alert(pattern.test(str));//返回true
② 正則表達(dá)式去掉標(biāo)志g
var pattern = /^[1-9]\d{4,10}$/i; var str = "88888"; alert(pattern.test(str));//返回true str = "888888"; alert(pattern.test(str));//返回true
5) 說(shuō)明:
① exec()
和test()
是正則表達(dá)式的方法,而不是字符串的方法,它的參數(shù)才是字符串;match
是字符串的方法,而不是正則表達(dá)式的方法,它的參數(shù)才是正則表達(dá)式。
② 即使設(shè)置了g標(biāo)志,exec()
每次只返回一個(gè)匹配項(xiàng)。沒有設(shè)置g標(biāo)志時(shí),exec()
和match()
執(zhí)行結(jié)果相同;設(shè)置g標(biāo)志時(shí),match()
將忽略子表達(dá)式,只查找全匹配正則表達(dá)式。
③ exec()
和match()
的區(qū)別:
a. 當(dāng)正則表達(dá)式無(wú)子表達(dá)式,并且沒有設(shè)置g標(biāo)志時(shí),exec()
和match()
執(zhí)行結(jié)果相同,均返回第一個(gè)匹配的字符串內(nèi)容。
var pattern = new RegExp("cat") ; var str = "onecat twocat"; alert(pattern.exec(str));//返回cat alert(str.match(pattern));//返回cat
b. 當(dāng)正則表達(dá)式無(wú)子表達(dá)式,并且設(shè)置g標(biāo)志時(shí),exec()
返回第一個(gè)匹配的字符串內(nèi)容,若存在多處匹配內(nèi)容,則match()
返回的是包含所有匹配字符串的數(shù)組。
var pattern = new RegExp("cat","g") ; var str = "onecat twocat"; alert(pattern.exec(str));//返回cat alert(str.match(pattern));//返回cat,cat
c. 當(dāng)正則表達(dá)式有子表達(dá)式,并且沒有設(shè)置g標(biāo)志時(shí),exec()
和match()
執(zhí)行結(jié)果相同,都查找全匹配正則表達(dá)式和子表達(dá)式,并返回包含全匹配字符串和匹配子表達(dá)式的數(shù)組。
var pattern = new RegExp("c(at)") ; var str = "onecat twocat"; alert(pattern.exec(str));//返回cat,at alert(str.match(pattern));//返回cat,at
d. 當(dāng)正則表達(dá)式有子表達(dá)式,并且設(shè)置g標(biāo)志時(shí),exec()
和match()
執(zhí)行的結(jié)果不相同,match()
將忽略子表達(dá)式,只查找全匹配正則表達(dá)式,并返回包含所有匹配字符串的數(shù)組。
var pattern = new RegExp("c(at)","g") ; var str = "onecat twocat"; alert(pattern.exec(str));//返回cat,at alert(str.match(pattern));//返回cat,cat
三個(gè)標(biāo)志:全局模式g,不區(qū)分大小寫模式i,多行模式m。
PS:這里再為大家提供2款非常方便的正則表達(dá)式工具供大家參考使用:
JavaScript正則表達(dá)式在線測(cè)試工具:
http://tools.jb51.net/regex/javascript
正則表達(dá)式在線生成工具:
http://tools.jb51.net/regex/create_reg
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript正則表達(dá)式技巧大全》、《JavaScript替換操作技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript中json操作技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com