正則表達式中有兩種基本元素:git
元字符彙總正則表達式
特殊字符spa |
用途ip |
.字符串 |
匹配除換行符之外的任意單個字符。在awk中,句點也能匹配換行符。it |
*table |
匹配任意一個(包括零個)在它面前的字符(包括由正則表達式指定的字符)awk |
[…]變量 |
匹配方括號中的字符類中的任意一個。若是方括號中第一個字符爲脫字符號(^),則表示否認匹配,即匹配出了換行符和類中列出的哪些字符之外的全部字符。在awk中,也匹配換行符。連字符(-)用於表示字符的範圍。若是類中的第一個字符爲右方括號(])則表示它是類的成員。全部其餘的元字符在被指定爲類中成員時都會失去它們原來的含義。擴展 |
^ |
若是做爲正則表達式的第一個字符,則表示匹配行的開始。在awk中匹配字符串的開始,即便字符串包含嵌入的換行符。 |
$ |
若是做爲正則表達式的最後一個字符,則表示匹配行的結尾。在awk中匹配字符串的結尾,即便字符串包含嵌入的換行符。 |
\{n,m\} |
匹配它前面某個範圍內單個字符出現的次數(包括由正則表達式指定的字符)。\{n,m\}將匹配n次出現,\{n,\}至少匹配n次出現,並且\{n,m\}匹配n和m之間的任意次出現。 |
\ |
轉意隨後的特殊字符。 |
+ |
匹配前面的正則表達式的一次或屢次出現。 |
? |
匹配前面的正則表達式的零次或一次出現。 |
| |
指定能夠匹配其前面的或後面的正則表達式。 |
() |
對正則表達式分組 |
{n,m} |
匹配它前面某個範圍內單個字符出現的次數(包括由正則表達式指定的字符)。{n}表示匹配n次出現,{n,}表示至少匹配n次出現,{n,m}匹配n和m之間的任意次出現。 |
元字符反斜槓(/)將元字符轉換成普通字符(或將普通字符轉換成元字符)。它強制將任意元字符解釋爲普通字符,一邊匹配該字符自己。
在sed中,使用反斜槓將一組普通字符轉意爲元字符。
如 \(\) \{\} \n
字符類是對通配符概念的改進。咱們能夠列出要匹配的字符,而不是匹配特殊位置的任意字符。使用方括號元字符([])將字符列表括起來,其中每一個字符佔據一個位置。
注意:在方括號中元字符會失去它們的含義。
如[Ww]hat能夠匹配what或者What
字符類中的的特殊字符:
字符 |
功能 |
\ |
轉義任意特殊字符(只用於awk中) |
- |
當它再也不第一個或最後一個位置時,表示一個範圍。 |
^ |
僅當在第一個位置時表示反轉匹配。 |
反斜槓只在awk中是特殊的,所以可使用字符類"[a\]1]"以匹配一個a、一個]或一個1。
若是閉括號(])是做爲類中的第一個字符出現(或者是脫字符後的第一個字符),那麼它就被解釋爲類的一個成員。若是連字符在一個類中是第一個或最後一個字符,則失去其特殊含義。所以,爲了匹配算術操做符,咱們在下面的實例中將連字符(-)放在第一位:
[-+*/]
使用正則表達式匹配下面的日期,該日期可能有下面兩種格式:
MM-DD-YY
MM/DD/YY
下面的正則表達式指示每一個字符位置可能的樹枝範圍:
[0-9][0-9][-/][0-3][0-9][-/][0-9][0-9]
"-"或"/"均可能是定界符。在第一個位置防止連字符確保它在字符類中解釋爲字面意義,即做爲一個連字符,而不是指示一個範圍。
一般,字符類包括在哪一個位置想要匹配的全部字符。在類中做爲第一個字符的脫字符(^)將類中全部字符都排除在被匹配以外。相反,除換行符之外沒有在列的方括號中的任意字符都將被匹配。
下面的模式將匹配任意非數字字符:
[^0-9]
它匹配字面表中全部的大寫和小寫字面以及全部特殊字符,例如標點符號。
POSIX標準對正則表達式字符和操做符的含義進行了形式化。這種標準定義了兩類正則表達式:基本的正則表達式(BRE),grep和sed使用這種正則表達式;擴展的正則表達式,egrep和awk使用這種正則表達式。
POSIX還改變了經常使用的屬於,咱們一直成爲"字符類"的東西在POSIX標準中成爲"括號表達式"。在括號表達式中,出了字面字符(例如a, !等)之外,還能夠由其餘標記。如:
全部這3種結果都必須出如今括號表達式的方括號中。例如[[:alpha:]!]匹配任意單個字幕字符或感嘆號,[[.ch.]]匹配整理元素ch,但不止匹配字幕c或字幕h。
POSIX字符類:
[:alnum:] |
可打印的字符(包括空白字符) |
[:alpha:] |
字母字符 |
[:blank:] |
空格和製表符 |
[:cntrl:] |
控制字符 |
[:digit:] |
數字字符 |
[:graph:] |
可打印和可見的(非空格)字符 |
[:lower:] |
小寫字符 |
[:print:] |
可打印的字符(包括空包字符) |
[:punct:] |
標點符號字符 |
[:space:] |
空白字符 |
[:upper:] |
大寫字符 |
[:xdigit:] |
十六進制數字 |
有兩個元字符用於指定字符串出如今行首或行末的上下文。脫字符^表示行開始,$表示行結束。
可使用兩個聯繫的定位元字符來匹配空行,即:
^$
可使用這種模式計算文件中的空行數,在grep中使用計數選項-c:
# grep –c '^$' ch04
5
若是想使用sed來刪除空行,那麼這個正則表達式頗有用。下面的正則表達式能夠用於匹配空行,即便其中包含空格:
^□*$
一樣,可使用如下表達式匹配整個行:
^.*$
在sed(和grep)中,只有當"^"和"$"分別出如今正則表達式的開始或結尾纔是特殊的。所以"^abc" 意味着 "匹配只處於行開始處的字母a、b和c",而"ab^c"覺得着"匹配處於行的任意位置的a、b、字面意義的^,而後是c"。這對於"$"一樣適用。
在awk中則不一樣,"^"和"$"老是特殊的,即便它們可能使編寫的正則表達式不匹配任何東西。能夠說,在awk中,當想要匹配字面"^"或"$"時,無論它處於正則表達式的什麼位置都應該使用反斜槓對其進行轉義。
在grep和sed中使用\{和\}。POSIX egrep 和 POSIX awk使用{和}。在任何狀況下,大括號包圍一個或兩個參數。
\{n,m\}
n和m是0到255之間的整數。若是隻指定\{n\}自己,那麼將精確匹配前面的字符或正則表達式的n次出現。若是指定\{n,m\},那麼就匹配出現的次數爲n和m之間的任意次數。
豎線(|)元字符是元字符擴展集的一部分,用於指定正則表達式的聯合。若是某行匹配其中的一個正則表達式,那麼它就匹配該模式。
圓括號()用於對正則表達式進行分組並設置優先級。它們是元字符擴展集的一部分。假設在文本文件中將公司的名稱爲"BigOne"或"BigOneComputer",使用正則表達式:
BigOne(Computer)?
將匹配字符串"BigOne"自己或者後面跟有一個字符串"□Computer"的形式。一樣,有些屬於有時會用全拼,有時會用縮寫、則可使用:
# egrep "Lab(oratorie)?s" mail.list
Bell Laboratories, Lucent Technologies
Bell Labs
能夠用豎線和圓括號來對選擇性操做進行分組。在下面的示例中,使用它來指定單詞"company"的單數或複數匹配。
compan(y|ies)
注意:大多數sed和grep 的版本中不能對加圓括號的一組字符應用數量詞,可是在egrep和awk的全部版本都是能夠的。
一個正則表達式爲:
A.*Z
匹配的結果爲
All of us, including Zippy, our dog
All of us, including Zippy and Ziggy
All of us, including Zippy and Ziggy and Zelda
下劃線的字符串表示匹配的字符串,即.*在每種狀況下都會匹配可能的最長的範圍。
正則表達式嘗試匹配最長的字符串,這可能會引發意想不到的問題。例如,下面的正則表達式與引號中的任意個字符匹配:
".*"
輸入字符串爲:
.Se "Appendix" "Full Progarm Listings."
要匹配第一個參數,能夠用下面的正則表達式來描述:
\.Se ".*"
然而,由於模式中的第二個引號與該行上的最後一個引號匹配,因此它結束匹配整個行。若是知道參數的個數,那麼能夠對每一個進行說明:
\.Se ".*" ".*"
雖然這種方法能夠像指望的那樣工做,可是每行也許不會有相同書目的參數,省略你只想要第一個參數。這裏有一個匹配兩個引號之間最短範圍的正則表達式:
"[^ "]*"
它匹配引號而且後面跟有任意個字符的狀況,但它不匹配引號後面跟有引號的狀況。
國家的縮寫 |
□[A-Z][A-Z]□ |
HTML代碼 |
<[^ >]*> |
匹配空行 |
^$ |
匹配整行 |
^.*$ |
匹配一個或多個空格(空內容的行) |
□□* |