JavaScript引用類型RegExp基本用法詳解
本文實例講述了JavaScript引用類型RegExp基本用法。分享給大家供大家參考,具體如下:
1、正則表達式定義
三個標志:全局模式g,不區(qū)分大小寫模式i,多行模式m。
1) 字面量定義
var pattern = /[fe]at/gim;
2) 構造函數(shù)定義:
接收兩個參數(shù)——要匹配的字符串模式和可選的模式字符串(g,i,m)。
var pattern = new RegExp("[fe]at","gim");
注意:
1) 若需要匹配的字符串中包含以下元字符,就必須對它們進行轉義:( [ { \ ^ & | ) ? * + . ] } 。
2) 由于構造函數(shù)定義正則表達式的參數(shù)是字符串,所以在某些情況下要對字符時行雙重轉義如\n,字符\在字符串中通常被轉義為\\,而在正則表達式字符串參數(shù)中就會變成\\\\,字面量模式/\w\\hello\\123/等價的字符串為“\\w\\\\hello\\\\123”。
2、RegExp實例屬性
- 1) global 表示是否設置了g標志。
- 2) ignoreCase 表示是否設置了i標志。
- 3) multiline 表示是否設置了m標志。
- 4) lastIndex 用于記錄上一次匹配結束的位置,即下一次開始搜索下一個匹配項的位置,從0算起。
- 5) Source返回正則表達式的字符串表示,按照字面量模式返回而非傳入構造函數(shù)的字符串模式返回。
var pattern = new RegExp("\\[fe\\]at","i");
alert(pattern.source);
以上代碼返回\[fe\]at
3、RegExp實例方法
1) 繼承的toLocaleString()、toString()、valueOf()方法
toLocaleString():返回正則表達式的字面量,與創(chuàng)建正則表達式的方式無關。
toString():返回正則表達式的字面量,與創(chuàng)建正則表達式的方式無關。
valueOf():返回正則表達式本身。
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ù):用于匹配的正則表達式。
返回值:區(qū)分match()的返回值主要是看是否設置g標志,沒有設置g標志時與exec()是等價的。
a. 如果設置g標志,那么返回的是包含所有匹配項的數(shù)組。
b. 如果沒有設置g標志,那么返回的是包含第一個匹配項的數(shù)組,第0項是與整個正則表達式匹配的字符串,第1項是是與第1個子表達式相匹配的文本(如果有的話),第2項是與第2個子表達式相匹配的文本(如果有的話)。
3) exec()方法
參數(shù):要應用模式的字符串。
返回值:返回包含第一個匹配項信息的數(shù)組,沒有匹配項的情況下返回null。exec()的返回值不受g標志影響,在不設置g標志時,在同一個字符串上多次調用exec()將會始終返回第一個匹配項的信息。即使設置了g標志,一次也只返回一個匹配項,但設置g標志時,每次調用exec()都會在字符串中繼續(xù)查找新匹配項,會驅動lastIndex可以模擬遍歷所有匹配,可以與match()設置g標志時等價(區(qū)別在于遍歷所有匹配時,exec()需要多次匹配,match()一次匹配即可得到所有匹配)。
返回的數(shù)組包含額外的兩個屬性:index和input。其中,index表示匹配項在字符串中的位置,而input表示應用正則表達式的字符串。在數(shù)組中,第0項是與整個正則表達式匹配的字符串,第1項是是與第1個子表達式相匹配的文本(如果有的話),第2項是與第2個子表達式相匹配的文本(如果有的話)。
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"
在不設置g標志的情況下,同一個字符串上調用exec()始終返回第一個匹配項的信息。
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
設置全局標志g情況下,同一個字符串上調用exec()每次會返回一個新的匹配項的信息。
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ù):要應用模式的字符串
返回值:在模式與該參數(shù)匹配的情況下返回true,否則返回false。
test()方法經(jīng)常用于if語句中。
問題:
如果正則表達式帶有標志g,使用test校驗不同的字符串時,RegExp會使用test前一個字符串得出的lastIndex去test后一個字符串,必定出錯。
var pattern = /^[1-9]\d{4,10}$/gi;
var str = "88888";
alert(pattern.test(str));//返回true
str = "888888";
alert(pattern.test(str));//返回false
解決方法:
① 將正則表達式的 lastIndex 屬性設置為0 再用作校驗
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
② 正則表達式去掉標志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) 說明:
① exec()和test()是正則表達式的方法,而不是字符串的方法,它的參數(shù)才是字符串;match是字符串的方法,而不是正則表達式的方法,它的參數(shù)才是正則表達式。
② 即使設置了g標志,exec()每次只返回一個匹配項。沒有設置g標志時,exec()和match()執(zhí)行結果相同;設置g標志時,match()將忽略子表達式,只查找全匹配正則表達式。
③ exec()和match()的區(qū)別:
a. 當正則表達式無子表達式,并且沒有設置g標志時,exec()和match()執(zhí)行結果相同,均返回第一個匹配的字符串內容。
var pattern = new RegExp("cat") ;
var str = "onecat twocat";
alert(pattern.exec(str));//返回cat
alert(str.match(pattern));//返回cat
b. 當正則表達式無子表達式,并且設置g標志時,exec()返回第一個匹配的字符串內容,若存在多處匹配內容,則match()返回的是包含所有匹配字符串的數(shù)組。
var pattern = new RegExp("cat","g") ;
var str = "onecat twocat";
alert(pattern.exec(str));//返回cat
alert(str.match(pattern));//返回cat,cat
c. 當正則表達式有子表達式,并且沒有設置g標志時,exec()和match()執(zhí)行結果相同,都查找全匹配正則表達式和子表達式,并返回包含全匹配字符串和匹配子表達式的數(shù)組。
var pattern = new RegExp("c(at)") ;
var str = "onecat twocat";
alert(pattern.exec(str));//返回cat,at
alert(str.match(pattern));//返回cat,at
d. 當正則表達式有子表達式,并且設置g標志時,exec()和match()執(zhí)行的結果不相同,match()將忽略子表達式,只查找全匹配正則表達式,并返回包含所有匹配字符串的數(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,不區(qū)分大小寫模式i,多行模式m。
PS:這里再為大家提供2款非常方便的正則表達式工具供大家參考使用:
JavaScript正則表達式在線測試工具:
http://tools.jb51.net/regex/javascript
正則表達式在線生成工具:
http://tools.jb51.net/regex/create_reg
更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript正則表達式技巧大全》、《JavaScript替換操作技巧總結》、《JavaScript查找算法技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》、《JavaScript中json操作技巧總結》、《JavaScript錯誤與調試技巧總結》及《JavaScript數(shù)學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
相關文章
JavaScript 判斷iPhone X Series機型的方法
這篇文章主要介紹了JavaScript 判斷iPhone X Series機型的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01
JavaScript實現(xiàn)顯示函數(shù)調用堆棧的方法
這篇文章主要介紹了JavaScript實現(xiàn)顯示函數(shù)調用堆棧的方法,實例分析了JavaScript顯示函數(shù)調用堆棧的具體作用與使用方法,需要的朋友可以參考下2016-04-04
微信小程序實現(xiàn)動態(tài)渲染Markdown示例詳解
這篇文章主要為大家介紹了微信小程序實現(xiàn)動態(tài)渲染Markdown示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
JavaScript 實現(xiàn)拖拽效果組件功能(兼容移動端)
這篇文章主要介紹了JavaScript 實現(xiàn)拖拽效果組件功能(兼容移動端),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
利用HTML與JavaScript實現(xiàn)注冊頁面源碼
這篇文章主要給大家介紹了關于利用HTML與JavaScript實現(xiàn)注冊頁面的相關資料,文中通過代碼介紹的非常詳細,對大家實現(xiàn)注冊頁面具有一定的參考借鑒價值,需要的朋友可以參考下2023-12-12
詳談js中window.location.search的用法和作用
下面小編就為大家?guī)硪黄斦刯s中window.location.search的用法和作用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02

