先要談?wù)勗贘S中,正則表達(dá)式的匹配方式是怎么樣的
- 有一個(gè)例子,如下圖,我想將字符串里面的
!dare you!和!an!兩個(gè)字符串匹配出來,于是我使用了正則表達(dá)式/!.+!/去匹配。

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

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

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

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

貪婪模式
上面的匹配模式就是貪婪模式的匹配方式,貪婪模式也是正則表達(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è)字符串

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

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

3.所以我們最后得到的就是符合要求的!dare you!和!an!兩個(gè)字符串
總結(jié):
1.JS中的正則表達(dá)式的貪婪模式和非貪婪模式主要是匹配方式上有所不同;
2.正則中的?可以使正則式采用非貪婪模式進(jìn)行匹配;
3.正則中的g可以進(jìn)入全局匹配的模式;
4.正則中的+是一個(gè)或多個(gè)的意思,如果沒有,則不能進(jìn)行匹配;