關(guān)于JS正則表達(dá)式的貪婪模式與非貪婪模式

先要談?wù)勗贘S中,正則表達(dá)式的匹配方式是怎么樣的

  • 有一個例子,如下圖,我想將字符串里面的!dare you!!an!兩個字符串匹配出來,于是我使用了正則表達(dá)式/!.+!/去匹配。
匹配出`!dare you!`和`!an!`兩個字符串

但是,我們來看結(jié)果,這個正則表達(dá)式匹配出來的是!dare you! I have !an!,其中I have并不是我想要匹配出來的字符串,這是為什么呢?請看JS正則表達(dá)式的匹配方式:

匹配結(jié)果不盡如人意
  • 正則表達(dá)式的匹配方式
    1.首先在how !dare you! I have !an! apple這個字符串中,使用/!.+!/進(jìn)行匹配,那么這個正則式首先尋找的是一個感嘆號!,如下圖:
匹配到!號

2.匹配到!后,他會繼續(xù)向后匹配感嘆號,但是后面的是字母d,不是感嘆號,于是/!.+!/正則就會開始匹配.,而.這個符號可以匹配除換行符外的全部字符,于是它就一直匹配到了最后,直到文本結(jié)束:

.號一直匹配到最后

3..號匹配完畢后,開始匹配后面的!,于是正則/!.+!/開始往回匹配感嘆號!,一直匹配到an后面的!,發(fā)現(xiàn)符合規(guī)則了,于是匹配出來的就是這一串字符串!dare you! I have !an!

最后匹配結(jié)果

貪婪模式

上面的匹配模式就是貪婪模式的匹配方式,貪婪模式也是正則表達(dá)式的默認(rèn)匹配方式。

非貪婪模式的匹配方式

  • 如果想要對該字符串進(jìn)行非貪婪模式的匹配,我們就需要對正則/!.+!/進(jìn)行改寫,改寫成如下代碼:

var b = /!.+?!/g
其中,g表示采用全局匹配的模式進(jìn)行匹配,而?則會使該正則式使用非貪婪模式進(jìn)行匹配,該正則就會以最小的.的重復(fù)數(shù)進(jìn)行匹配。

它的匹配結(jié)果如下圖,剛好符合了要求,匹配出了!dare you!!an!兩個字符串

非貪婪模式匹配結(jié)果
  • 非貪婪模式的匹配方式
    1.與貪婪模式一樣先匹配!,然后進(jìn)行.的匹配,但是與貪婪模式不同的是,它每匹配一次.,就會往后匹配一次!,于是就出現(xiàn)了如下圖的結(jié)果:
非貪婪模式匹配`!`和`.`

2.然后匹配成功了后面的!后,因為g是全局匹配,所以該正則又會從頭開始匹配第一個!,到了!an!后,匹配成功第一個!和兩個.,以及后面的!,于是!an!也被匹配上了,然后該正則又剩下的字符串開始從新匹配,而后面因為不能匹配出第一個!,于是就沒有匹配出來:

匹配出`!an!`

3.所以我們最后得到的就是符合要求的!dare you!!an!兩個字符串

總結(jié):

1.JS中的正則表達(dá)式的貪婪模式和非貪婪模式主要是匹配方式上有所不同;
2.正則中的?可以使正則式采用非貪婪模式進(jìn)行匹配;
3.正則中的g可以進(jìn)入全局匹配的模式;
4.正則中的+是一個或多個的意思,如果沒有,則不能進(jìn)行匹配;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容