正則基礎

1.行的開始和結束


元素組成部分:metacharacters & literal (元字符和普通字符)。
1.1 ^: 一行的開頭。
1.2 &: 一行的結束。
1.3 ^cat&:行開頭, 而後匹配cat, 行結尾(沒有多餘的單詞、空白字符 )。
1.4 ^&:空行(沒有任何字符,包括空白字符)。
1.5 ^:行開頭。正則表達式

2.字符組


2.1 [···]:中括號內部列出指望匹配的字符。
2.2 [123456]:匹配1到6,裏面匹配是或的意思。
2.3 [1-6]:一樣匹配1-6,其中的-是字符組元字符(在字符組內部-->字符組元字符)。code

注意:只在字符組內部且不是第一個元素,連字符纔是元字符,不然它就只能普通的連字符號。對象

3.排除型字符組


3.1 用[^123]取代[123],表明除了123之外的其餘元素,其中的^表明排除的意思。
3.2 q[^u]是匹配字母q後不是u的狀況,可是咱們要考慮到一些問題,就是q多是大寫的Q,因此建議咱們直接用[Qq][^u]。還有就是q正好位於行尾,緊跟着的會是換行符,若是正則沒有保留換行符,那麼q以後就沒有元素,一樣匹配不到(一個字符組,就算是排除型字符組,也須要匹配一個字符)。
3.3 [^x]:匹配一個不是x的字符,而不是說,只有當這個位置不是x時才能匹配(剛剛說的正好在行尾的狀況)。blog

注意:這裏的^表示排除之意,與以前在字符組外部表示行錨點的^不一樣,這裏的^是一個元字符(在字符組內部且緊跟首個方括號以後)。文檔

4.點符號匹配任意字符


4.1 .:匹配任意字符
好比03/19/76,03-19-76,03.19.76,要匹配這些,咱們不嫌麻煩能夠這樣 03[-./]19[-./]76,其實能夠簡單這樣匹配 03.19.76。可是這樣還會出現問題,他甚至會匹配到03319 76,這一點上顯然沒有前者精確,這就須要咱們在檢索精確度和文檔瞭解度以前權衡。其實能夠經過轉義字符把元字符轉化爲普通的字符,從而更精確的匹配,後文會講到。it

注意:點符號並非元字符,由於它在字符組內部。在字符組裏面和外面,元字符的定義和意義是不同的,這裏的-一樣不是連字符,由於它雖然位於字符組內,可是是在首個元素位置。table

若是這樣寫[.-/],那就表明元字符了,用來表示範圍,可是這樣寫明顯是錯誤的用法。class

5.多選結構


5.1 |:元字符,或的意思。依靠該字符能夠把任意的正則表達式組合成一個總的表達式,而且總表達式能夠匹配其中的任意子表達式。
例如gr[ea]y能夠寫做grey|graygr(e|a)y,其中括號用來劃定多選結構的範圍(正常狀況下,括號也是元字符 )。meta

注意:gr[e|a]y不符合咱們的要求,由於在這裏|只是一個普通字符。引用

在這裏,gr[ea]ygr(e|a)y表示的意思同樣,不要認爲多選結構和字符組同樣,一個字符組只能匹配目標文本中的單個字符,可是多選結構自身均可以是完整的正則表達式,均可以匹配任意長度的文本。

還有一點須要注意,就是多選結構和^$一塊兒使用的時候。
5.2 ^From|Subject|Data:*:匹配的是^FromSubjectData:*
5.3 ^(From|Subject|Data):*:匹配一行的起始位置,而後是FromSubjectData任意一個,最後匹配:*

6.忽略大小寫


6.1 egrep命令中加入-i參數便可,好比咱們不對From區分大小寫,那總不能這樣寫[Ff][Rr][Oo][Mm],這樣顯然繁瑣,只須要忽略大小寫便可。

7.單詞分界符


7.1 \<\>:單詞分界符,匹配單詞分界的位置。因爲單個<>並非元字符,所以相似這種稱爲metasequences(元字符序列)。
下圖所示,單詞開頭位置用向上的箭頭標識,單詞結束的位置用向下的箭頭標識。

8.小結


咱們總結一下到目前爲止學到的元字符

元字符 名稱 匹配對象
. 逗號 單個任意字符
[···] 字符組 列出的任意字符
[^···] 排除型字符組 未列出的任意字符
^ 脫字符 行的起始位置
$ 美圓符 行的結束位置
< 反斜槓-小於 單詞的起始位置(某些版本的egrep可能不支持)
\> 反斜槓-大於 單詞的結束位置(某些版本的egrep可能不支持)
| 豎線 匹配分隔兩邊的任意一個表達式
(···) 括號 限制豎線的做用範圍,其餘功能下文論述

9.可選元素


9.1 x?:表明x元素無關緊要,不會匹配失敗。
9.2 colou?r:匹配color或則colour。
假如匹配英語中的7月4日(July fourth),7能夠是July,也能夠簡寫爲Jul,4能夠是fourth、4th和4。咱們可使用(July;Jul) (fourth;4th;4)也可使用July? (fourth|4(th)?)

10.其餘量詞:重複出現


10.1 +:以前緊鄰的元素出現一次或屢次,若是連一次都沒有匹配成功,就匹配失敗。
10.2 *:前緊鄰的元素出現任意屢次或不出現,和同樣,不會匹配失敗。
?+*這些統稱爲量詞,由於他們限定了所做用元素的匹配次數。

表示重複的元字符總結

···· 次數下限 次數上限 含義
1 能夠不出現,也能夠只出現一次(單詞可選)
* 能夠出現無數次,也能夠不出現(任意次數都可)
+ 1 能夠能夠出現無數次,但至少要出現一次(至少一次)

規定重現次數的範圍:區間

10.3 ···{min,max}:區間量詞。問號對應的區間量詞是{0,1}
10.4 [a-zA-z]{1,5}:匹配美國的股票代碼(1到5個字母)。
固然並非全部的egrep都支持。

11.括號及反向引用


到目前爲止,咱們見識過括號的兩種用途:限制多項式的範圍;將如干個字符組合爲一個單元,受問號和星號之類量詞的做用。如今介紹另一種用途,反向引用。好比咱們匹配重複的單詞,使用the the,這樣可能仍是會匹配到the theory這種,其實使用\<the the\>卻是能夠解決這個問題。可是重複單詞就不止這一個,窮舉顯示不現實。因而咱們想着匹配全部重複單詞,首先匹配一個單詞,讓後面匹配的單詞和先前匹配一樣的單詞便可。

11.1 \<([A-Za-z]+) +\1\>:匹配重複單詞(記得加上-i參數忽略大小寫),其中第一個單詞使用括號括起來,再跟上一個特殊的元字符序列\1

固然,在一個表達式中咱們可使用多個括號。\1\2\3等來表示第1、第2、第三組括號匹配的文本。括號是按照開括號(從左至右的出現順序進行的,因此([a-z])([0-9])\1\2中的\1表明[a-z]匹配的內容,而\2表明[0-9]匹配的內容。

另外,該表達式雖然頗有用,可是,咱們要知道它的侷限性,重複的單詞第一個位於某行末尾,第二個在下一行的開頭,這個表達式就沒法找到。

12.轉義


12.1 ega\.att\.com:匹配ega.att.com,把原本是元字符的.轉化爲普通字符。
12.2 \([a-zA-Z]+\):用來匹配一個括號內的單詞。

相關文章
相關標籤/搜索