一般在有著1年半以上的程序員基本上都是知道這個厲害的東西的,它對字符串處理的能力可以說是生猛無比。雖然大家都在使用(有時候在開發(fā)的Code中,有時候是在我們自己心愛的Editor里),但是我相信大部分人對這里禽獸的了解程度只是停留在會用的層次上。下面我對它進行一下詳細的說明。
正則表達式的“祖先”可以一直上溯至對人類神經(jīng)系統(tǒng)如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經(jīng)生理學(xué)家研究出一種數(shù)學(xué)方式來描述這些神經(jīng)網(wǎng)絡(luò)。
1956 年, 一位叫 Stephen Kleene 的美國數(shù)學(xué)家在 McCulloch 和 Pitts 早期工作的基礎(chǔ)上,發(fā)表了一篇標題為“神經(jīng)網(wǎng)事件的表示法”的論文,引入了正則表達式的概念。正則表達式就是用來描述他稱為“正則集的代數(shù)”的表達式,因此采用“正則表達式”這個術(shù)語。
隨后,發(fā)現(xiàn)可以將這一工作應(yīng)用于使用Ken Thompson 的計算搜索算法的一些早期研究,Ken Thompson是Unix 的主要發(fā)明人。正則表達式的第一個實用應(yīng)用程序就是 Unix 中的qed 編輯器。
如他們所說,剩下的就是眾所周知的歷史了。從那時起直至現(xiàn)在正則表達式都是基于文本的編輯器和搜索工具中的一個重要部分。
使用正則表達式
在典型的搜索和替換操作中,必須提供要查找的確切文字。這種技術(shù)對于靜態(tài)文本中的簡單搜索和替換任務(wù)可能足夠了,但是由于它缺乏靈活性,因此在搜索動態(tài)文本時就有困難了,甚至是不可能的。
使用正則表達式,就可以:
測試字符串的某個模式。例如,可以對一個輸入字符串進行測試,看在該字符串是否存在一個電話號碼模式或一個信用卡號碼模式。這稱為數(shù)據(jù)有效性驗證。
替換文本。可以在文檔中使用一個正則表達式來標識特定文字,然后可以全部將其刪除,或者替換為別的文字。
根據(jù)模式匹配從字符串中提取一個子字符串。可以用來在文本或輸入字段中查找特定文字。
例如,如果需要搜索整個 web 站點來刪除某些過時的材料并替換某些HTML 格式化標記,則可以使用正則表達式對每個文件進行測試,看在該文件中是否存在所要查找的材料或 HTML 格式化標記。用這個方法,就可以將受影響的文件范圍縮小到包含要刪除或更改的材料的那些文件。然后可以使用正則表達式來刪除過時的材料,最后,可以再次使用正則表達式來查找并替換那些需要替換的標記。
許多種工具都支持正則表達式(文本編輯器、文字處理軟件、系統(tǒng)工具、數(shù)據(jù)庫引擎,等等),不過,要想充分挖掘正則表達式的能力,還是應(yīng)當將它作為編程語言的一部分。例如Java、JScript、Visual Basic、VBScript、JavaScript、ECMAScript、C、C++、C#、elisp、Perl、Python、Tcl、Ruby、PHP、sed和awk。事實上,在一些用上述語言編寫的程序中,正則表達式扮演了極其重要的角色。
正則表達式能夠得到眾多語言和工具的支持是有原因的:它們極其有用。從較低的層面上來說,正則表達式描述的是一串文本(a chunk of text)的特征。大家可以用它來驗證用戶輸入的數(shù)據(jù),或者也可以用它來檢索大量的文本。從較高的層面上來說,正則表達式容許用戶掌控他們自己的數(shù)據(jù)——控制這些數(shù)據(jù),讓它們?yōu)樽约悍?wù)。掌握正則表達式,就是掌握自己的數(shù)據(jù)。
可見它的重要性,難怪每款編輯器和編程語言不同程度的實現(xiàn)了它,使得普通用戶和開發(fā)人員受益不淺。