正規表達式(regularexpression)
前言
正規表達式是煩瑣的,但是強大的,學會之後的應用會讓你除了提高效率外,會給你帶來絕對的成就感。隻要認真去閱讀這些資料,加上應用的時候進行一定的參考,掌握正規表達式不是問題。
索引
1._引子
2._正規表達式的曆史
3._正規表達式定義
3.1_普通字元
3.2_非列印字元
3.3_特殊字元
3.4_限定符
3.5_定位符
3.6_選擇
3.7_後向引用
4._各種操作符的運算優先級
5._全部符号解釋
6._部分例子
7._正規表達式比對規則
7.1_基本模式比對
7.2_字元簇
7.3_确定重複出現
1. 引子
目前,正規表達式已經在很多軟體中得到廣泛的應用,包括*nix(Linux, Unix等),HP等作業系統,PHP,C#,Java等開發環境,以及很多的應用軟體中,都可以看到正規表達式的影子。
正規表達式的使用,可以通過簡單的辦法來實作強大的功能。為了簡單有效而又不失強大,造成了正規表達式代碼的難度較大,學習起來也不是很容易,是以需要付出一些努力才行,入門之後參照一定的參考,使用起來還是比較簡單有效的。
例子: ^[email protected]+//..+$
這樣的代碼曾經多次把我自己給吓退過。可能很多人也是被這樣的代碼給吓跑的吧。繼續閱讀本文将讓你也可以自由應用這樣的代碼。
注意:這裡的第7部分跟前面的内容看起來似乎有些重複,目的是把前面表格裡的部分重新描述了一次,目的是讓這些内容更容易了解。
2. 正規表達式的曆史 正規表達式的“祖先”可以一直上溯至對人類神經系統如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經生理學家研究出一種數學方式來描述這些神經網絡。
1956 年, 一位叫 Stephen Kleene 的數學家在 McCulloch 和 Pitts 早期工作的基礎上,發表了一篇标題為“神經網事件的表示法”的論文,引入了正規表達式的概念。正規表達式就是用來描述他稱為“正則集的代數”的表達式,是以采用“正規表達式”這個術語。
随後,發現可以将這一工作應用于使用 Ken Thompson 的計算搜尋算法的一些早期研究,Ken Thompson 是 Unix 的主要發明人。正規表達式的第一個實用應用程式就是 Unix 中的 qed 編輯器。
如他們所說,剩下的就是衆所周知的曆史了。從那時起直至現在正規表達式都是基于文本的編輯器和搜尋工具中的一個重要部分。
3. 正規表達式定義
正規表達式(regular expression)描述了一種字元串比對的模式,可以用來檢查一個串是否含有某種子串、将比對的子串做替換或者從某個串中取出符合某個條件的子串等。
列目錄時, dir *.txt或ls *.txt中的*.txt就不是一個正規表達式,因為這裡*與正則式的*的含義是不同的。
正規表達式是由普通字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。正規表達式作為一個模闆,将某個字元模式與所搜尋的字元串進行比對。
3.1 普通字元
由所有那些未顯式指定為元字元的列印和非列印字元組成。這包括所有的大寫和小寫字母字元,所有數字,所有标點符号以及一些符号。
3.2 非列印字元 字元 含義 /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。
3.3 特殊字元 所謂特殊字元,就是一些有特殊含義的字元,如上面說的"*.txt"中的*,簡單的說就是表示任何字元串的意思。如果要查找檔案名中有*的檔案,則需要對*進行轉義,即在其前加一個/。ls .?[0-9]*$ //所有的小數
當然這并不能從技術上降低正規表達式的複雜性,但可以使它們更容易閱讀。