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

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

- 正則表達(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!:

貪婪模式
上面的匹配模式就是貪婪模式的匹配方式,貪婪模式也是正則表達(dá)式的默認(rèn)匹配方式。
非貪婪模式的匹配方式
- 如果想要對該字符串進(jìn)行非貪婪模式的匹配,我們就需要對正則
/!.+!/進(jìn)行改寫,改寫成如下代碼:
var b = /!.+?!/g
其中,g表示采用全局匹配的模式進(jìn)行匹配,而?則會使該正則式使用非貪婪模式進(jìn)行匹配,該正則就會以最小的.的重復(fù)數(shù)進(jìn)行匹配。
它的匹配結(jié)果如下圖,剛好符合了要求,匹配出了!dare you!和!an!兩個字符串

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

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

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