正則表達式匹配主要有兩種,匹配字符和匹配位置。環視我我的理解應該更像是匹配位置的。具體下文說到。下面先看一下環視的正則表達式書寫格式。正則表達式
類型 | 正則表達式 | 匹配成功條件 |
確定逆序環視 | (?<=expresion) | 子表達式可以匹配左側文本 |
否認逆序環視 | (?<!expresion) | 子表達式不能匹配左側文本 |
確定順序環視 | (?=expresion) | 子表達式可以匹配右側文本 |
否認順序環視 | (?!expresion) | 字表達式不能匹配右側文本 |
本表摘自《精通正則表達式》p66ide
你要是以爲我會按照上面的表格來理解你就錯了,看完上面的表格我是一臉懵逼的,用的時候更加會一臉懵逼,而後把書本中p66頁前面的幾頁再翻了幾遍,發現一段很重要的話,順序環視會檢查子表達式可否匹配,但它只尋找可以匹配的位置,而不會真正「佔用」這些字符。好了,你們趕忙畫重點,考試要考,它只尋找可以匹配的位置,也就是說環視只是匹配位置,而不是匹配文本,匹配位置最多見的就是^和$,指匹配文本的開頭和結尾,而後把上面的表格再轉換一下就是字符串
類型 | 正則表達式 | 匹配成功條件 |
確定逆序環視 | (?<=expresion) | 匹配子表達式右側的位置 |
否認逆序環視 | (?<!expresion) | 匹配非子表達式右側的位置 |
確定順序環視 | (?=expresion) | 匹配子表達式左側的位置 |
否認順序環視 | (?!expresion) | 匹配非子表達式左側的位置 |
單單看這個表仍是有點一臉懵逼,那就來舉幾個栗子。玩正則表達式推薦大家一個利器,簡直能稱爲神器,RegexBuddy,是《精通正則表達式》中介紹的。下面的例子我都是用他來完成。it
一、(?=\d)io
能夠理解爲匹配數字左邊的位置,而後把匹配到的位置替換爲逗號,結果如圖,圖中左上角爲正則表達式和替換字符串,右下角爲匹配的文本和替換的結果table
看圖中右下角高亮的逗號,就是以前的匹配的位置。class
二、(?!\b)im
匹配非數字左邊的位置,而後把這些匹配的位置替換爲逗號,結果如圖margin
對比1和2的兩個圖你就會發現(?=\b)和(?!\b)是互補的關係,兩個表達式匹配的位置合起來就是該匹配的文本的全部位置。img
三、書中例子完善
《精通正則表達式》書中環視用了一個例子來貫通。該例子也比較經常使用,就是對於比較大的數值,咱們通常在其中間加入逗號,這樣才能更容易看懂,如112347915若是寫成112,347,915就會比較清晰一點。
下面我將一步步說明如何把「今年的營業額爲112347915.5465萬元」替換爲「今年的營業額爲112,347,915.5465萬元」
a、要替換的位置在數字的左邊
正則表達式:(?=\d)
替換結果:今年的營業額爲,1,1,2,3,4,7,9,1,5.,5,4,6,5萬元
b、要替換的位置右邊至少有三個數字,也就是位置是在三個數字左邊
正則表達式:(?=\d\d\d)
替換結果:今年的營業額爲,1,1,2,3,4,7,915.,5,465萬元
c、要匹配的位置左邊應該有數字,也就是該位置應該是在數字的右邊
正則表達式:(?<=\d)(?=\d\d\d)
替換結果:今年的營業額爲1,1,2,3,4,7,915.5,465萬元
d、匹配位置的時候須要沒隔三個數字進行匹配,這時候就要用到量詞"+"了
正則表達式:(?<=\d)(?=(\d\d\d)+(?!\d))
替換結果:今年的營業額爲112,347,915.5,465萬元
其中(?=(\d\d\d)+(?!\d))的意思就是指匹配一個位置,該位置是在(\d\d\d)+(?!\d)的左邊,也就是該位置是在一個非數字的左邊的每三個數字的左邊(囧,有點繞口)。
e、最後排除掉小數點後面的位置,也就是匹配的位置不能是在小數點以後的連續數字中。
正則表達式:(?<=\d)(?<!\.\d+)(?=(\d\d\d)+(?!\d))
替換結果:今年的營業額爲112,347,915.5465萬元