JS中正則表達(dá)式要注意lastIndex屬性
說明
這篇文章,主要和大家聊聊JavaScript中RegExp對象的屬性。
解釋
每個RegExp對象都包含5個屬性,source、global、ignoreCase、multiline、lastIndex。
source:是一個只讀的字符串,包含正則表達(dá)式的文本。
var reg = /JavaScript/; reg.source; //返回 JavaScript
global:是一個只讀的布爾值,看這個正則表達(dá)式是否帶有修飾符g。
修飾符g,是全局匹配的意思,檢索字符串中所有的匹配。
var str = "JavaScript"; str.match(/JavaScript/); //只能匹配一個JavaScript var str = "JavaScript JavaScript"; str.match(/JavaScript/g); //能匹配兩個JavaScript var reg = /JavaScript/; reg.global; //返回 false var reg = /JavaScript/g; reg.global; //返回 true
ignoreCase:是一個只讀的布爾值,看這個正則表達(dá)式是否帶有修飾符i。
修飾符i,說明模式匹配是不區(qū)分大小寫的。
var reg = /JavaScript/; reg.ignoreCase; //返回 false var reg = /JavaScript/i; reg.ignoreCase; //返回 true var reg = /JavaScript/; reg.test("javascript"); //返回 false var reg = /JavaScript/i; reg.test("javascript"); //返回 true
multiline:是一個只讀的布爾值,看這個正則表達(dá)式是否帶有修飾符m。
修飾符m,用以在多行模式中執(zhí)行匹配,需要配合^ 和 $</code> 使用,使用<code>^</code> 和 <code>$ 除了匹配整個字符串的開始和結(jié)尾之外,還能匹配每行的開始和結(jié)尾。
var str="java\nJavaScript"; str.match(/^JavaScript/); //返回null var str="java\nJavaScript"; str.match(/^JavaScript/m); //匹配到一個JavaScript var reg=/JavaScript/; reg.multiline; //返回false var reg=/JavaScript/m; reg.multiline; //返回true
lastIndex:是一個可讀/寫的整數(shù),如果匹配模式中帶有g(shù)修飾符,這個屬性存儲在整個字符串中下一次檢索的開始位置,這個屬性會被exec( ) 和 test( ) 方法用到。
exec( )方法是在一個字符串中執(zhí)行匹配檢索,如果它沒有找到任何匹配,它就返回null,但如果它找到了一個匹配,它就返回一個數(shù)組。
當(dāng)調(diào)用exec( )的正則表達(dá)式對象具有修飾符g時,它將把當(dāng)前正則表達(dá)式對象的lastIndex屬性設(shè)置為緊挨著匹配子串的字符位置,當(dāng)同一個正則表達(dá)式第二次調(diào)用exec( ),它會將從lastIndex屬性所指示的字符串處開始檢索,如果exec( )沒有發(fā)現(xiàn)任何匹配結(jié)果,它會將lastIndex重置為0。
test( )方法,它的參數(shù)是一個字符串,用test( )對某個字符串進(jìn)行檢測,如果包含正則表達(dá)式的一個匹配結(jié)果,則返回true,否則返回false。
var str="java"; var reg=/JavaScript/; reg.test(str); //返回false var str="JavaScript"; var reg=/JavaScript/; reg.test(str); //返回true
當(dāng)調(diào)用test( )的正則表達(dá)式對象具有修飾符g時,它的行為和exec( )相同,因?yàn)樗鼜膌astIndex指定的位置處開始檢索某個字符串,如果它找到了一個匹配結(jié)果,那么它就立即設(shè)置lastIndex為緊挨著匹配子串的字符位置
看看下面這段有趣的代碼
var str="JavaScript"; var reg=/JavaScript/g; console.log(reg.test(str)); //打印 true console.log(reg.test(str)); //打印 false
為什么同樣的字符串,同樣的正則表達(dá)式,卻打印的不一樣,如果你已經(jīng)理解了 lastIndex屬性,那你一定明白為什么。
我們來看看到底發(fā)什么了什么
var str="JavaScript"; var reg=/JavaScript/g; console.log(reg.test(str)); //打印 true console.log(reg.lastIndex); //打印10,因?yàn)槠ヅ涞搅薐avaScript,所以設(shè)置lastIndex為匹配結(jié)果緊挨著的字符位置 console.log(reg.test(str)); //打印 false,因?yàn)閺膌astIndex位置檢索字符串,已經(jīng)沒有匹配結(jié)果了 console.log(reg.lastIndex); //打印0,因?yàn)闆]有匹配到結(jié)果,所以將lastIndex重置為0
這里注意一點(diǎn),如果第一次調(diào)用test( )匹配結(jié)束后,我們手動將lastIndex重置為0,那么第二次調(diào)用test( ),同樣可以打印true
var str="java JavaScript java"; var reg=/JavaScript/g; console.log(reg.test(str)); //打印 true reg.lastIndex=0; console.log(reg.test(str)); //打印 true
在強(qiáng)調(diào)一次,上面說的關(guān)于lastIndex的問題,都是因?yàn)檎齽t表達(dá)式對象中帶有修飾符g,如果不帶有修飾符g,就不用擔(dān)心這些問題了。
總結(jié)
這次主要是說說,JavaScript中正則表達(dá)式對象的5個屬性,而最需要注意的就是lastIndex屬性了。
相關(guān)文章
element-ui 上傳圖片后標(biāo)注坐標(biāo)點(diǎn)
有個組件庫的名稱叫做element-ui,基于Vue2.0開發(fā),提供了豐富的PC端組件,本文通過實(shí)例代碼給大家介紹element-ui 上傳圖片后標(biāo)注坐標(biāo)點(diǎn)的示例代碼,感興趣的朋友跟隨小編一起看看吧2021-07-07利用js實(shí)現(xiàn)Vue2.0中數(shù)據(jù)的雙向綁定功能
vue數(shù)據(jù)雙向綁定是通過數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者模式的方式來實(shí)現(xiàn)的,下面這篇文章主要給大家介紹了關(guān)于如何利用js實(shí)現(xiàn)Vue2.0中數(shù)據(jù)的雙向綁定功能的相關(guān)資料,需要的朋友可以參考下2021-07-07js與jQuery實(shí)現(xiàn)的用戶注冊協(xié)議倒計(jì)時功能實(shí)例【三種方法】
這篇文章主要介紹了js與jQuery實(shí)現(xiàn)的用戶注冊協(xié)議倒計(jì)時功能,結(jié)合實(shí)例形式分析了三種倒計(jì)時功能的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-11-11JS實(shí)現(xiàn)移動端實(shí)時監(jiān)聽輸入框變化的實(shí)例代碼
這篇文章主要介紹了JS實(shí)現(xiàn)移動端實(shí)時監(jiān)聽輸入框變化的解決方案,需要的朋友可以參考下2017-04-04

JS 獲取HTML標(biāo)簽內(nèi)的子節(jié)點(diǎn)的方法

javascript實(shí)現(xiàn)倒計(jì)時并彈窗提示特效