元素組成部分:metacharacters & literal (元字符和普通字符)。
1.1 ^
: 一行的開頭。
1.2 &
: 一行的結束。
1.3 ^cat&
:行開頭, 而後匹配cat, 行結尾(沒有多餘的單詞、空白字符 )。
1.4 ^&
:空行(沒有任何字符,包括空白字符)。
1.5 ^
:行開頭。正則表達式
2.1 [···]
:中括號內部列出指望匹配的字符。
2.2 [123456]
:匹配1到6,裏面匹配是或的意思。
2.3 [1-6]
:一樣匹配1-6,其中的-
是字符組元字符(在字符組內部-->字符組元字符)。code
注意:只在字符組內部且不是第一個元素,連字符纔是元字符,不然它就只能普通的連字符號。對象
3.1 用[^123]
取代[123]
,表明除了123之外的其餘元素,其中的^
表明排除的意思。
3.2 q[^u]
是匹配字母q後不是u的狀況,可是咱們要考慮到一些問題,就是q多是大寫的Q,因此建議咱們直接用[Qq][^u]
。還有就是q正好位於行尾,緊跟着的會是換行符,若是正則沒有保留換行符,那麼q以後就沒有元素,一樣匹配不到(一個字符組,就算是排除型字符組,也須要匹配一個字符)。
3.3 [^x]
:匹配一個不是x的字符,而不是說,只有當這個位置不是x時才能匹配(剛剛說的正好在行尾的狀況)。blog
注意:這裏的^表示排除之意,與以前在字符組外部表示行錨點的^不一樣,這裏的^是一個元字符(在字符組內部且緊跟首個方括號以後)。文檔
4.1 .
:匹配任意字符
好比03/19/76,03-19-76,03.19.76,要匹配這些,咱們不嫌麻煩能夠這樣 03[-./]19[-./]76
,其實能夠簡單這樣匹配 03.19.76
。可是這樣還會出現問題,他甚至會匹配到03319 76
,這一點上顯然沒有前者精確,這就須要咱們在檢索精確度和文檔瞭解度以前權衡。其實能夠經過轉義字符把元字符轉化爲普通的字符,從而更精確的匹配,後文會講到。it
注意:點符號並非元字符,由於它在字符組內部。在字符組裏面和外面,元字符的定義和意義是不同的,這裏的-
一樣不是連字符,由於它雖然位於字符組內,可是是在首個元素位置。table
若是這樣寫[.-/]
,那就表明元字符了,用來表示範圍,可是這樣寫明顯是錯誤的用法。class
5.1 |
:元字符,或的意思。依靠該字符能夠把任意的正則表達式組合成一個總的表達式,而且總表達式能夠匹配其中的任意子表達式。
例如gr[ea]y
能夠寫做grey|gray
或gr(e|a)y
,其中括號用來劃定多選結構的範圍(正常狀況下,括號也是元字符 )。meta
注意:gr[e|a]y
不符合咱們的要求,由於在這裏|
只是一個普通字符。引用
在這裏,gr[ea]y
和gr(e|a)y
表示的意思同樣,不要認爲多選結構和字符組同樣,一個字符組只能匹配目標文本中的單個字符,可是多選結構自身均可以是完整的正則表達式,均可以匹配任意長度的文本。
還有一點須要注意,就是多選結構和^
和$
一塊兒使用的時候。
5.2 ^From|Subject|Data:*
:匹配的是^From
,Subject
,Data:*
。
5.3 ^(From|Subject|Data):*
:匹配一行的起始位置,而後是From
,Subject
,Data
任意一個,最後匹配:*
。
6.1 egrep命令中加入-i
參數便可,好比咱們不對From區分大小寫,那總不能這樣寫[Ff][Rr][Oo][Mm]
,這樣顯然繁瑣,只須要忽略大小寫便可。
7.1 \<
和\>
:單詞分界符,匹配單詞分界的位置。因爲單個<
和>
並非元字符,所以相似這種稱爲metasequences(元字符序列)。
下圖所示,單詞開頭位置用向上的箭頭標識,單詞結束的位置用向下的箭頭標識。
咱們總結一下到目前爲止學到的元字符
元字符 | 名稱 | 匹配對象 |
---|---|---|
. | 逗號 | 單個任意字符 |
[···] | 字符組 | 列出的任意字符 |
[^···] | 排除型字符組 | 未列出的任意字符 |
^ | 脫字符 | 行的起始位置 |
$ | 美圓符 | 行的結束位置 |
< | 反斜槓-小於 | 單詞的起始位置(某些版本的egrep可能不支持) |
\> | 反斜槓-大於 | 單詞的結束位置(某些版本的egrep可能不支持) |
| | 豎線 | 匹配分隔兩邊的任意一個表達式 |
(···) | 括號 | 限制豎線的做用範圍,其餘功能下文論述 |
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.1 +
:以前緊鄰的元素出現一次或屢次,若是連一次都沒有匹配成功,就匹配失敗。
10.2 *
:前緊鄰的元素出現任意屢次或不出現,和?
同樣,不會匹配失敗。
像?
、+
、*
這些統稱爲量詞,由於他們限定了所做用元素的匹配次數。
表示重複的元字符總結
···· | 次數下限 | 次數上限 | 含義 |
---|---|---|---|
? | 無 | 1 | 能夠不出現,也能夠只出現一次(單詞可選) |
* | 無 | 無 | 能夠出現無數次,也能夠不出現(任意次數都可) |
+ | 1 | 無 | 能夠能夠出現無數次,但至少要出現一次(至少一次) |
規定重現次數的範圍:區間
10.3 ···{min,max}
:區間量詞。問號對應的區間量詞是{0,1}
。
10.4 [a-zA-z]{1,5}
:匹配美國的股票代碼(1到5個字母)。
固然並非全部的egrep都支持。
到目前爲止,咱們見識過括號的兩種用途:限制多項式的範圍;將如干個字符組合爲一個單元,受問號和星號之類量詞的做用。如今介紹另一種用途,反向引用。好比咱們匹配重複的單詞,使用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.1 ega\.att\.com
:匹配ega.att.com
,把原本是元字符的.
轉化爲普通字符。
12.2 \([a-zA-Z]+\)
:用來匹配一個括號內的單詞。