正則運算式 - 簡介
除非您以前使用過正則運算式,否則您可能不熟悉一些術語。但是,毫無疑問,您已經使用過不涉及腳本的某些正則運算式概念。
例如,您很可能使用 ? 和 * 通配符來查找硬碟上的檔。? 通配符匹配檔案名中的 0 個或 1 個字元,而 * 通配符匹配零個或多個字元。像 data(\w)?\.dat 這樣的模式將查找下列檔:
data.dat data1.dat data2.dat datax.dat dataN.dat
使用 * 字元代替 ? 字元擴大了找到的檔的數量。data.*\.dat 匹配下列所有檔:
data.dat data1.dat data2.dat data12.dat datax.dat dataXYZ.dat
儘管這種搜索方法很有用,但它還是有限的。通過理解 * 通配符的工作原理,引入了正則運算式所依賴的概念,但正則運算式功能更強大,而且更加靈活。
正則運算式的使用,可以通過簡單的辦法來實現強大的功能。下麵先給出一個簡單的示例:
-
^ 為匹配輸入字串的開始位置。
-
[0-9]+匹配多個數字, [0-9] 匹配單個數字,+ 匹配一個或者多個。
-
abc$匹配字母 abc 並以 abc 結尾,$ 為匹配輸入字串的結束位置。
我們在寫用戶註冊表單時,只允許用戶名包含字元、數字、下劃線和連接字元(-),並設置用戶名的長度,我們就可以使用以下正則運算式來設定。
以上的正則運算式可以匹配 zaixian、zaixian1、run-oob、run_oob, 但不匹配 ru,因為它包含的字母太短了,小於 3 個無法匹配。也不匹配 zaixian$, 因為它包含特殊字元。
實例
匹配以數字開頭,並以 abc 結尾的字串。:
以下標記的文本是獲得的匹配的運算式:
繼續閱讀本教程將讓您也可以自由應用這樣的代碼。
為什麼使用正則運算式?
典型的搜索和替換操作要求您提供與預期的搜索結果匹配的確切文本。雖然這種技術對於對靜態文本執行簡單搜索和替換任務可能已經足夠了,但它缺乏靈活性,若採用這種方法搜索動態文本,即使不是不可能,至少也會變得很困難。
通過使用正則運算式,可以:
- 測試字串內的模式。
例如,可以測試輸入字串,以查看字串內是否出現電話號碼模式或信用卡號碼模式。這稱為數據驗證。 - 替換文本。
可以使用正則運算式來識別文檔中的特定文本,完全刪除該文本或者用其他文本替換它。 - 基於模式匹配從字串中提取子字串。
可以查找文檔內或輸入域內特定的文本。
例如,您可能需要搜索整個網站,刪除過時的材料,以及替換某些 HTML 格式標記。在這種情況下,可以使用正則運算式來確定在每個檔中是否出現該材料或該 HTML 格式標記。此過程將受影響的檔列表縮小到包含需要刪除或更改的材料的那些檔。然後可以使用正則運算式來刪除過時的材料。最後,可以使用正則運算式來搜索和替換標記。
發展歷史
正則運算式的"祖先"可以一直上溯至對人類神經系統如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經生理學家研究出一種數學方式來描述這些神經網路。
1956 年, 一位叫 Stephen Kleene 的數學家在 McCulloch 和 Pitts 早期工作的基礎上,發表了一篇標題為"神經網事件的表示法"的論文,引入了正則運算式的概念。正則運算式就是用來描述他稱為"正則集的代數"的運算式,因此採用"正則運算式"這個術語。
隨後,發現可以將這一工作應用於使用 Ken Thompson 的計算搜索演算法的一些早期研究,Ken Thompson 是 Unix 的主要發明人。正則運算式的第一個實用應用程式就是 Unix 中的 qed 編輯器。
如他們所說,剩下的就是眾所周知的歷史了。從那時起直至現在正則運算式都是基於文本的編輯器和搜索工具中的一個重要部分。
應用領域
目前,正則運算式已經在很多軟體中得到廣泛的應用,包括 *nix(Linux, Unix等)、HP 等操作系統,PHP、C#、Java 等開發環境,以及很多的應用軟體中,都可以看到正則運算式的影子。
C# 正則運算式
在我們的 C# 教學中,C# 正則運算式 這一章節專門介紹了有關 C# 正則運算式的知識。
Java 正則運算式
在我們的 Java 教學中,Java 正則運算式 這一章節專門介紹了有關 Java 正則運算式的知識。
JavaScript 正則運算式
在我們的 JavaScript 教學中,JavaScript RegExp 對象 這一章節專門介紹了有關 JavaScript 正則運算式的知識,同時我們還提供了完整的 JavaScript RegExp 對象參考手冊。
Python 正則運算式
在我們的 Python 基礎教學中,Python 正則運算式 這一章節專門介紹了有關 Python 正則運算式的知識。
Ruby 正則運算式
在我們的 Ruby 教學中,Ruby 正則運算式 這一章節專門介紹了有關 Ruby 正則運算式的知識。
命令或環境 | . | [ ] | ^ | $ | \( \) | \{ \} | ? | + | | | ( ) |
vi | √ | √ | √ | √ | √ | |||||
Visual C++ | √ | √ | √ | √ | √ | |||||
awk | √ | √ | √ | √ | awk是支持該語法的,只是要在命令 行加入 --posix or --re-interval參數即可,可見 man awk中的interval expression | √ | √ | √ | √ | |
sed | √ | √ | √ | √ | √ | √ | ||||
delphi | √ | √ | √ | √ | √ | √ | √ | √ | √ | |
python | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
java | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
javascript | √ | √ | √ | √ | √ | √ | √ | √ | √ | |
php | √ | √ | √ | √ | √ | |||||
perl | √ | √ | √ | √ | √ | √ | √ | √ | √ | |
C# | √ | √ | √ | √ | √ | √ | √ | √ |