先要談?wù)勗贘S中各吨,正則表達(dá)式的匹配方式是怎么樣的
- 有一個(gè)例子,如下圖蜒程,我想將字符串里面的
!dare you!
和!an!
兩個(gè)字符串匹配出來绅你,于是我使用了正則表達(dá)式/!.+!/
去匹配伺帘。
但是昭躺,我們來看結(jié)果,這個(gè)正則表達(dá)式匹配出來的是!dare you! I have !an!
伪嫁,其中I have
并不是我想要匹配出來的字符串领炫,這是為什么呢?請看JS正則表達(dá)式的匹配方式:
- 正則表達(dá)式的匹配方式
1.首先在how !dare you! I have !an! apple
這個(gè)字符串中张咳,使用/!.+!/
進(jìn)行匹配帝洪,那么這個(gè)正則式首先尋找的是一個(gè)感嘆號!
,如下圖:
2.匹配到葱峡!后,他會繼續(xù)向后匹配感嘆號龙助,但是后面的是字母d
砰奕,不是感嘆號,于是/!.+!/
正則就會開始匹配.
提鸟,而.
這個(gè)符號可以匹配除換行符外的全部字符军援,于是它就一直匹配到了最后,直到文本結(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!
兩個(gè)字符串
- 非貪婪模式的匹配方式
1.與貪婪模式一樣先匹配!
,然后進(jìn)行.
的匹配琳拨,但是與貪婪模式不同的是瞭恰,它每匹配一次.
,就會往后匹配一次!
狱庇,于是就出現(xiàn)了如下圖的結(jié)果:
2.然后匹配成功了后面的!
后惊畏,因?yàn)?code>g是全局匹配,所以該正則又會從頭開始匹配第一個(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)行匹配较曼;