正則表達(dá)式匹配主要有兩種,匹配字符和匹配位置。環(huán)視我個(gè)人理解應(yīng)該更像是匹配位置的。具體下文說到。下面先看一下環(huán)視的正則表達(dá)式書寫格式。

類型正則表達(dá)式匹配成功條件
肯定逆序環(huán)視(?<=expresion)子表達(dá)式能夠匹配左側(cè)文本
否定逆序環(huán)視(?<!expresion)子表達(dá)式不能匹配左側(cè)文本
肯定順序環(huán)視(?=expresion)子表達(dá)式能夠匹配右側(cè)文本
否定順序環(huán)視(?!expresion)字表達(dá)式不能匹配右側(cè)文本

 

 

 

 

本表摘自《精通正則表達(dá)式》p66

 

你要是覺得我會(huì)按照上面的表格來(lái)理解你就錯(cuò)了,看完上面的表格我是一臉懵逼的,用的時(shí)候更加會(huì)一臉懵逼,然后把書本中p66頁(yè)前面的幾頁(yè)再翻了幾遍,發(fā)現(xiàn)一段很重要的話,順序環(huán)視會(huì)檢查子表達(dá)式能否匹配,但它只尋找能夠匹配的位置,而不會(huì)真正“占用”這些字符。好了,大家趕緊畫重點(diǎn),考試要考,它只尋找能夠匹配的位置,也就是說環(huán)視只是匹配位置,而不是匹配文本,匹配位置最常見的就是^和$,指匹配文本的開頭和結(jié)尾,然后把上面的表格再轉(zhuǎn)換一下就是

 

類型正則表達(dá)式匹配成功條件
肯定逆序環(huán)視(?<=expresion)匹配子表達(dá)式右側(cè)的位置
否定逆序環(huán)視(?<!expresion)匹配非子表達(dá)式右側(cè)的位置
肯定順序環(huán)視(?=expresion)匹配子表達(dá)式左側(cè)的位置
否定順序環(huán)視(?!expresion)匹配非子表達(dá)式左側(cè)的位置

 

 

 

 

 

 單單看這個(gè)表還是有點(diǎn)一臉懵逼,那就來(lái)舉幾個(gè)栗子。玩正則表達(dá)式推薦你們一個(gè)利器,簡(jiǎn)直能稱為神器,RegexBuddy,是《精通正則表達(dá)式》中介紹的。下面的例子我都是用他來(lái)完成。

1、(?=\d)

可以理解為匹配數(shù)字左邊的位置,然后把匹配到的位置替換為逗號(hào),結(jié)果如圖,圖中左上角為正則表達(dá)式和替換字符串,右下角為匹配的文本和替換的結(jié)果

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

看圖中右下角高亮的逗號(hào),就是之前的匹配的位置。

2、(?!\b)

匹配非數(shù)字左邊的位置,然后把這些匹配的位置替換為逗號(hào),結(jié)果如圖

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

 對(duì)比1和2的兩個(gè)圖你就會(huì)發(fā)現(xiàn)(?=\b)和(?!\b)是互補(bǔ)的關(guān)系,兩個(gè)表達(dá)式匹配的位置合起來(lái)就是該匹配的文本的所有位置。

3、書中例子完善

《精通正則表達(dá)式》書中環(huán)視用了一個(gè)例子來(lái)貫通。該例子也比較常用,就是對(duì)于比較大的數(shù)值,我們一般在其中間加入逗號(hào),這樣才能更容易看懂,如112347915如果寫成112,347,915就會(huì)比較清晰一點(diǎn)。

下面我將一步步說明如何把“今年的營(yíng)業(yè)額為112347915.5465萬(wàn)元”替換為“今年的營(yíng)業(yè)額為112,347,915.5465萬(wàn)元

a、要替換的位置在數(shù)字的左邊

正則表達(dá)式:(?=\d)

替換結(jié)果:今年的營(yíng)業(yè)額為,1,1,2,3,4,7,9,1,5.,5,4,6,5萬(wàn)元

b、要替換的位置右邊至少有三個(gè)數(shù)字,也就是位置是在三個(gè)數(shù)字左邊

正則表達(dá)式:(?=\d\d\d)

替換結(jié)果:今年的營(yíng)業(yè)額為,1,1,2,3,4,7,915.,5,465萬(wàn)元

c、要匹配的位置左邊應(yīng)該有數(shù)字,也就是該位置應(yīng)該是在數(shù)字的右邊

正則表達(dá)式:(?<=\d)(?=\d\d\d)

替換結(jié)果:今年的營(yíng)業(yè)額為1,1,2,3,4,7,915.5,465萬(wàn)元

d、匹配位置的時(shí)候需要沒隔三個(gè)數(shù)字進(jìn)行匹配,這時(shí)候就要用到量詞"+"了

正則表達(dá)式:(?<=\d)(?=(\d\d\d)+(?!\d))

替換結(jié)果:今年的營(yíng)業(yè)額為112,347,915.5,465萬(wàn)元

其中(?=(\d\d\d)+(?!\d))的意思就是指匹配一個(gè)位置,該位置是在(\d\d\d)+(?!\d)的左邊,也就是該位置是在一個(gè)非數(shù)字的左邊的每三個(gè)數(shù)字的左邊(囧,有點(diǎn)繞口)。

e、最后排除掉小數(shù)點(diǎn)后面的位置,也就是匹配的位置不能是在小數(shù)點(diǎn)之后的連續(xù)數(shù)字中。

正則表達(dá)式:(?<=\d)(?<!\.\d+)(?=(\d\d\d)+(?!\d))

替換結(jié)果:今年的營(yíng)業(yè)額為112,347,915.5465萬(wàn)元

 

----------------------------------------------------------------------結(jié)束分割線-----------------------------------------------------------------------------

 

這個(gè)正則表達(dá)式跟《精通正則表達(dá)式》中的差不多,我只是考慮到有小數(shù)的情況,所以稍加修改,得到(?<=\d)(?<!\.\d+)(?=(\d\d\d)+(?!\d)),不過該正則表達(dá)式在java和JavaScript中不能用,因?yàn)镴ava中的逆序環(huán)視不能加上量詞“+”,而JavaScript中沒有逆序環(huán)視。當(dāng)然如果用的時(shí)候沒有小數(shù)點(diǎn)的情況,直接可以用(?<=\d)(?=(\d\d\d)+(?!\d))來(lái)進(jìn)行替換,這個(gè)java也是能用的,JavaScript則依舊不能用。

http://www.cnblogs.com/fuhai/p/7169805.html