在咱們使用正則表達式匹配文本時,通常都是按照從左到右的順序進行的,環視(look around)是可以實如今特定位置向左或向右查看。環視結構不匹配任何字符,只匹配文本中的特定位置,這一點與單詞分界符」\b」,錨點」^」和」$」類似,可是環視更加通用。正則表達式
環視是正則表達式中的特殊結構,環視的正則表達式格式是以 "(?" 開頭,以")"結尾,以下所示:spa
註釋:!表示否認,=表示確定,<表示向左,exp表示環視的正則。blog
環視查找中的前(左)、後(右)是指位置和與被查找文本的相對位置而言,若是被查找文本在位置以後,稱做向右;若是被查找文本在位置以前,稱做向左。文檔
1,順序環視get
順序環視是從左到右查看文本,嘗試匹配正則。若是可以匹配,就返回匹配成功信息。順序環視又分確定型和否認型,對於確定性順序環視(positive look ahead)用特殊的序列」(?=…)」來表示,例如,」(?=\d)」 表示若是當前位置右邊的字符是數字,則匹配成功。 it
2,逆序環視入門
逆序環視是從右向左查看文本,使用特殊的序列(?<=…)表示,例如,」(?<=\d)」 表示若是當前位置的左邊是一位數字,則匹配成功,也就是說,緊跟在數字後面的位置。 class
環視匹配的是位置,不會佔用字符,也就是說,在檢查子表達式可否匹配的過程當中,環視自己不會佔用任何文本。舉例說明,對於普通正則表達式」Jeffrey」,在匹配文本」… by Jeffrey Friedl.」時,匹配到的結果是, 基礎
若是用確定型順序環視「(?=Jeffery)」匹配到的位置以下:
順序環視會檢查子表達式可否匹配,但它只尋找可以匹配的位置,而不會佔用這些字符,經過與普通正則表達式結合能夠獲得更精確的匹配,如「(?=Jeffery)Jeff」表示只能匹配」Jeffery」這個單詞中的」Jeff」。咱們還會發現」Jeff(?=rey)」與它是等價的。 該例子摘自《<基礎-2>入門實例, 順序環視,逆序環視》。im
環視是一個用於匹配位置的正則表達式,當匹配成功時,返回位置,環視用於查找在特定「位置」以前或以後的文本。
1,後綴匹配
(?=exp):位置的後面匹配表達式exp,返回exp位置以前的表達式。後綴匹配,和TSQL的 "%ing"相似;
好比正則表達式:\b\w+(?=ing\b)
分析:環視其後綴是ing,而且是單詞的結尾(\b),匹配以ing結尾的單詞,但返回單詞的前面部分,ing以前的部分;
例如,查找「I'm reading a book」,它會匹配「reading」,由於該字符後面以ing結尾,該正則表達式返回read,環視返回的文本不包含後綴。
2,前綴匹配
(?<=exp):文本的前面匹配表達式exp,返回exp位置以後的表達式。前綴匹配,和TSQL的 "re%"相似;
好比正則表達式:(?<=\bre)\w+\b
分析:單詞的打頭(\b),而且單詞的前綴是re,匹配以re開頭的單詞,返回單詞的後半部分,re以後的部分;
例如,查找「I am reading a book」,它會匹配「reading」,由於該字符前面以re打頭,該正則表達式返回ading,斷言返回的文本不包含前綴。
3,查找前綴或後綴不是特定文本的文本
這兩個斷言查找,跟前面兩個相反,做用不大,簡單瞭解一下:
3.1,後綴不是特定的文本
正則表達式:\b\w+(?!ing\b)
分析:不匹配以ing結尾的單詞,查找「I am reading a book」,返回的文本:I,am,a,book
3.2,前綴不是特定的文本
正則表達式:(?<!\bre)\w+\b
分析:不匹配以re打頭的單詞,查找「I am reading a book」,返回的文本:I,am,a,book
參考文檔: