Regular Expressions (1) ---- What is Regular Expressions?
正則表達式是常見常忘,所以還是記下來比較保險,於是就有了這篇筆記。
希望對大家會有所幫助。J
1.什麼是正則表達式.............................................................................................................................................................. 2
2.正則表達式的起源............................................................................................................................................................. 2
3. 正則表達式使用祥解........................................................................................................................................................ 3
3.1基本語法.............................................................................................................................................................................. 3
3.1.1普通字符..................................................................................................................................................................... 3
3.1.2非打印字符................................................................................................................................................................. 3
3.1.3特殊字符..................................................................................................................................................................... 3
3.1.4字符集........................................................................................................................................................................... 4
3.1.5在字符集中使用元字符............................................................................................................................................. 5
3.1.6預定義字符集.............................................................................................................................................................. 5
3.1.7 限定符........................................................................................................................................................................... 6
3.1.8定位符........................................................................................................................................................................... 6
3.1.9 “.”元字符...................................................................................................................................................................... 7
3.1.10用 “|”表示選擇.......................................................................................................................................................... 8
3.1.11用 “()”表示分組.................................................................................................................................................. 8
3.1.12 “?”的補充說明.......................................................................................................................................................... 8
3.1.13給正則表達式添加註釋......................................................................................................................................... 8
3.1.14操作符的運算優先級............................................................................................................................................... 8
3.2 高級話題............................................................................................................................................................................... 9
3.2.1反向引用..................................................................................................................................................................... 9
3.2.2在正則表達式中指定模式option........................................................................................................................... 9
3.2.3 Lookaround斷言..................................................................................................................................................... 10
4. 正則表達式基本語法索引............................................................................................................................................ 11
5. 正則表達式高級語法索引.............................................................................................................................................. 15
6. 參考資料.................................................................................................................................................................................
7. 推薦工具.................................................................................................................................................................................
1.什麼是正則表達式
簡單的說,正則表達式是一種可以用於文字模式匹配和替換的強有力的工具。是由一系列普通字符和特殊字符組成的能明確描述文本字符串的文字匹配模式。
正則表達式並非一門專用語言,但也可以看作是一種語言,它可以讓用戶通過使用一系列普通字符和特殊字符構建能明確描述文本字符串的匹配模式。除了簡單描述這些模式之外,正則表達式解釋引擎通常可用於遍歷匹配,並使用模式作爲分隔符來將字符串解析爲子字符串,或以智能方式替換文本或重新設置文本格式。正則表達式爲解決與文本處理有關的許多常見任務提供了有效而簡捷的方式。
正則表達式具有兩種標準:
· 基本的正則表達式(BRE – Basic Regular Expressions)
· 擴展的正則表達式(ERE – Extended Regular Expressions)。
ERE包括BRE功能和另外其它的概念。
正則表達式目前有兩種解釋引擎:
· 基於字符驅動(text-directed engine)
· 基於正則表達式驅動(regex-directed engine)
Jeffery Friedl把它們稱作DFA和NFA解釋引擎。
約定:
爲了描述起來方便,在本文中做一些約定:
1. 本文所舉例的所有表達時都是基於NFA解釋引擎的。
2. 正則表達式,也就是匹配模式,會簡寫爲Regex。
3. Regex的匹配目標,也就是目標字符串,會簡寫爲String。
4. 匹配結果用會用黃色底色標識。
5. 用1/+1=2 括起來的表示這是一個regex。
6. 舉例會用以下格式:
Regex |
Target String |
Description |
test |
This is a test |
會匹配test,testcase等 |
2.正則表達式的起源
正則表達式的“祖先”可以一直上溯至對人類神經系統如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經生理學家研究出一種數學方式來描述這些神經網絡。
1956 年, 一位叫 Stephen Kleene 的美國數學家在 McCulloch 和 Pitts 早期工作的基礎上,發表了一篇標題爲“神經網事件的表示法”的論文,引入了正則表達式的概念。正則表達式就是用來描述他稱爲“正則集的代數”的表達式,因此採用“正則表達式”這個術語。
隨後,發現可以將這一工作應用於使用Ken Thompson 的計算搜索算法的一些早期研究,Ken Thompson是Unix 的主要發明人。正則表達式的第一個實用應用程序就是 Unix 中的qed 編輯器。從那時起直至現在正則表達式都是基於文本的編輯器和搜索工具中的一個重要部分。具有完整語法的正則表達式使用在字符的格式匹配方面上,後來被應用到熔融信息技術領域。自從那時起,正則表達式經過幾個時期的發展,現在的標準已經被ISO(國際標準組織)批准和被Open Group組織認定。
3. 正則表達式使用祥解
最簡單的正則表達式相信大家都已熟悉並且經常使用,那就是文字字符串。特定的字符串可通過文字本身加以描述;像 test這樣的Regex模式可精確匹配輸入的字符串”test”,但是它也可以匹配this is a testcase,這就不是我們想要得結果。
當然,使用正則表達式匹配等於它自身的精確字符串是沒有價值的實現,不能體現正則表達式的真正作用。但是,假如要查找的不是test,而是所有以字母 t 開頭的單詞,或所有4個字母的單詞,那該怎麼辦?這超出了文字字符串的合理範圍。所以我們才需要深入地研究正則表達式。
3.1基本語法
雖然正則表達式並非一門專用語言,但它也有一些特殊的規定,也可以稱之爲基本語法。
正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱爲元字符)組成的文字模式。該模式描述在查找文字主體時待匹配的一個或多個字符串。正則表達式作爲一個模板,將某個字符模式與所搜索的字符串進行匹配。
構造正則表達式的方法和創建數學表達式的方法一樣。也就是用多種元字符與操作符將小的表達式結合在一起來創建更大的表達式。
可以通過在一對分隔符之間放入表達式模式的各種組件來構造一個正則表達式。
3.1.1普通字符
由所有那些未顯式指定爲元字符的打印和非打印字符組成。這包括所有的大寫和小寫字母字符,所有數字,所有標點符號以及一些符號。
3.1.2非打印字符
非打印字符也是普通字符,單獨列出來便於參考。
Symbol |
Description |
/cx |
匹配由x指明的控制字符。例如, /cM 匹配一個 Control-M 或回車符。x 的值必須爲 A-Z 或 a-z 之一。否則,將 c 視爲一個原義的 'c' 字符。 |
/f |
匹配一個換頁符。等價於 /x0c 和 /cL。 |
/n |
匹配一個換行符。等價於 /x0a 和 /cJ。 |
/r |
匹配一個回車符。等價於 /x0d 和 /cM。 |
/s |
匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ /f/n/r/t/v]。 |
/S |
匹配任何非空白字符。等價於 [^ /f/n/r/t/v]。 |
/t |
匹配一個製表符。等價於 /x09 和 /cI。 |
/v |
匹配一個垂直製表符。等價於 /x0b 和 /cK。 |
Regex中可以使用非打印字符。/t會匹配一個tab字符(ASC||),/r 會匹配一個回車(0x0D),/n 會匹配一個換行符(0x0A)。應該注意的是:Windows使用/r/n表示一行的結束,而UNIX使用/n 。
同樣,我們可以在Regex中使用16進制的ASCⅡ碼或者ANSI標準碼。在拉丁語中,版權符號的代碼是0xA9,所以我們也可以這樣來匹配版權符號 /xA9 。另外一個匹配tab的寫法是:/x09 。但是注意,第一位的“0”必須去掉。
3.1.3特殊字符
特殊字符也叫做元字符,保留字符(Metacharactor),在Regex中表示特殊的意義,大部分的意思在不同的上下文中的意義是不同的,這裏只列出最普遍的意義。
特殊字符共有11個:
Symbol |
Description |
$ |
匹配輸入字符串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '/n' 或 '/r'。要匹配 $ 字符本身,請使用 /$。 |
( ) |
標記一個子表達式的開始和結束位置。子表達式可以獲取供以後使用。要匹配這些字符,請使用 /( 和 /)。 |
* |
匹配前面的子表達式零次或多次。要匹配 * 字符,請使用 /*。 |
+ |
匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 /+。 |
. |
匹配除換行符 /n之外的任何單字符。要匹配 .,請使用 /。 |
[ |
標記一箇中括號表達式的開始。要匹配 [,請使用 /[。 |
? |
匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 /?。 |
/ |
將下一個字符標記爲或特殊字符、或原義字符、或反向引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'/n' 匹配換行符。序列 '//' 匹配 "/",而 '/(' 則匹配 "("。 |
^ |
匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符本身,請使用 /^。 |
{ |
標記限定符表達式的開始。要匹配 {,請使用 /{。 |
| |
指明兩項之間的一個選擇。要匹配 |,請使用 /|。 |
在元字符前加 / 轉義符,可以把特殊字符當作普通字符來使用。
比如:如要要匹配 1+1=2 ,正確的正則表達式應該爲1/+1=2。否則, + 會被當作特殊字符對待。
除了特殊字符,所有的其他字符都不應該加 / 。因爲 / 也是一個特殊字符。/ 和普通字符組合在一起也可以創造一種特殊的意義。比如 /d 表示匹配所有的數字。
作爲程序員,單引號和雙引號不是特殊字符會也許讓我們感到很驚訝。但這是正確的。因爲我們在編程的時候,編程語言會知道引號之間的哪些字符表示特殊意義,編譯器在把字符串x傳遞給regex解釋引擎之前,會把它們處理成regex。比如,在C#中,如果我們要匹配 1/+1=2 ,在程序中我們要這樣寫: “1//+1=2” ,C#編譯器會把 “//” ,處理爲一個“/” 。同樣,如果要匹配 C:/Temp ,首先,正則表達式要這樣寫 C://Temp,然後在程序中我們應該這樣寫:“ C:////temp”。
3.1.4字符集
字符集描述了一組字符,Regex解釋器會認爲匹配字符集中的一個字符就可以認爲匹配成功。
字符集用[ ]括起來即可。
比如gr[ae]y就可以匹配gray或者grey。
字符集只能匹配一個字符,gr[ae]y就不能和graey匹配。字符集中的字符順序是任意的,得到的結果都是唯一的。
可以在字符集中用連字符“-”來表示一個範圍。[0-9]的結果和[0123456789]的匹配結果都是相同的。字符集中的範圍可以有多種。比如[0-9a-fA-F]表示匹配所有的16進制,包括大小寫。也可以把範圍和單個字符組合在一起用,[0-9a-fxA-FX]表示匹配所有的16進制或者一個字符X。字符集的順序不會影響結果。
在字符集的開始標誌“[”後面加上一個“^”符號,表示否定,表示匹配除字符集中定義的字符以外的所有字符。包括非打印字符和行結束符。
注意:字符集匹配的一個字符,而不是一個位置。所以。q[^u]的意義不是“q後面的字符不是u”。而是“q後面的字符可以是除了u以外的所有字符”。
q[^u]不會和Iraq匹配。
但是會和Iraq is a country匹配,因爲q後面的空格字符是一個“不是u的字符”。
3.1.5在字符集中使用元字符
字符集中的元字符只能是 ‘]’, ‘/’, ‘^’, 和 ‘-‘ 。
其他元字符在字符集中都失去了特殊意義,表示的只是一個普通字符。也不需要用加“/”。
比如:
匹配一個“*”或者“+”,用[*+]就足夠了。即使給他們加上“/”,regex解釋器也會把他們忽略掉。
四種特殊字符的處理:
在字符集中要表示“]”,“^”和“-”需要在後面加上轉義符“/”,來表示它們代表的分別是普通字符“]”,“^”和“-”。
也可以把它們放在一個不能表示特殊意義的位置,後一個方法比較好,因爲他們不會影響可讀性。
- “^”
要想匹配一個“^”,可以把它放在除了緊跟“[”的任意一個位置。
Regex |
String |
Description |
[x^] |
A string with x and ^. |
匹配x或者“^” |
- “]”
可以把“]”放在緊跟着“[”的位置,或者使用否定字符集。
Regex |
String |
Description |
[]x] |
A string with x and ] |
匹配x或者“]” |
[^]x] |
A string with x and ] |
匹配除了x和”] ”以外的所有字符 |
- “/”
要想把“/”當作一個普通字符來匹配,而不是一個特殊字符,必須把“/”再用一個“/”括起來。
Regex |
String |
Description |
[//x] |
A string with x and / |
匹配x或者“/” |
- “-”
連字符可以放在緊跟着“[”的後面,或者正好“]”的前面,或者緊跟着“^”的後面。
Regex |
String |
Description |
[-x] |
A string with x and - |
匹配x或者“-” |
[x-] |
A string with x and - |
匹配x或者“-” |
3.1.6預定義字符集
因爲很多字符集是經常使用的,所以Regex解釋器預定義了一些常用字符集:
Regex |
Meaning |
Description |
/d |
[0-9] |
所有數字 |
/w |
[a-zA-Z] |
表示所有的字符,和文化字體有關 |
/s |
[ /t/r/n] |
空格,回車和tab。和文化字體有關 |
預訂一字符集可以既可以用在字符集裏面,也可以用在字符集外面。
Regex |
String |
Description |
/s/d |
1<space>+<space>2<space>=<space>3 |
匹配後面緊跟着一個數字的空白符 |
[/s/d] |
1<space>+<space>2<space>=<space>3 |
匹配一個單獨的字符或者一個數字或者一個空白符 |
[/da-fA-F]和[0-9a-fA-F]的匹配結果是一樣的。
同樣,在預定義字符集前面加一個“^”符號表示否定。它們也有預先定義好的表示:
Regex |
Meaning |
Description |
/D |
[^/d] |
非數字 |
/W |
[^/w] |
非字符,和文化字體有關 |
/S |
[^/s] |
非空格,回車和tab。和文化字體有關 |
在“[]”使用否定預訂一字符集時要特別心。[/D/S]不等於[/^d/s]。[/^d/s]會匹配除了數字和空白符以外的所有字符。而[/D/S]會匹配要麼不是一個數字,要麼是空白符。因爲數字不是空白符,空白符也不是數字,所以[/D/S]會匹配任意的字符。
3.1.7 限定符
限定符提供了一種簡單方法,用於指定在模式中允許特定字符或字符集自身重複出現的次數。限定符始終引用限定符前(左邊)的模式,通常是單個字符,除非使用括號創建模式組。
限定符有*或+或?或{n}或{n,}或{n,m}共6種。
Symbol |
Description |
Description |
? |
0次獲1次 |
|
* |
0次或n次 |
|
+ |
1次或n次 |
|
{min, max} |
最少min次,最多max次 |
Max必須大於等於min。 |
{min,<不指定> } |
最少min次,或者n次 |
|
{min} |
精確的重複min次 |
|
在字符集後面使用 “?”,”*”,”+”,表示重複。會重複整個的字符集,而不是重複匹配的那個字符。
Regex |
String |
意義 |
[0-9]+ |