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

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

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

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

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

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

.號(hào)一直匹配到最后

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

最后匹配結(jié)果

貪婪模式

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

非貪婪模式的匹配方式

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

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

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

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

2.然后匹配成功了后面的!后,因?yàn)?code>g是全局匹配,所以該正則又會(huì)從頭開始匹配第一個(gè)!,到了!an!后,匹配成功第一個(gè)!和兩個(gè).,以及后面的!,于是!an!也被匹配上了,然后該正則又剩下的字符串開始從新匹配,而后面因?yàn)椴荒芷ヅ涑龅谝粋€(gè)!,于是就沒有匹配出來:

匹配出`!an!`

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

總結(jié):

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

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

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

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