本文旨在介紹正規表達式最最基礎的部分便于不知道的讀者對正規表達式産生一個概念,科普一下(不一定能入門)。
什麼是正規表達式? 正規表達式,就是用來描述一個字元串結構的方法,和我們使用的通配符比較類似,但是又不一樣,可以說更強大。正規表達式主要用來在字元串中搜尋、替換、定位文本。
正規表達式可以幹什麼?
前面提到正規表達式能用來搜尋和替換,我們就想到了文本編輯器。确實,目前很多文本編輯器都內建了正規表達式搜尋比對和替換的功能,比如常用的 Notepad++
有了正規表達式,我們可以很友善地實作一些功能,比如我們有一個 txt 檔案
我們想把空格分隔變成逗号分隔,有同學說,直接将空格替換成逗号就可以了,但是試過之後,結果如下:
但是使用正規表達式進行替換,結果才是我們想要的:
Notepad++ 有個 RegEx Helper 插件可以幫助我們學習正規表達式。 我們經常使用的Windows 搜尋工具 everything (在 Search -> Enable Regex ),以及 Linux 的 grep 工具都支援正規表達式 在 Everything 中搜尋檔案名”包含 a 并接着兩個數字的”檔案:
使用grep 過濾檔案名結尾為一個數字的檔案:
另外,很多程式設計語言都支援正規表達式,比如 Java , C# , Python , Perl 之類的,尤其是 Perl ,已經将其內建到文法裡面。我們可以在程式設計語言中很友善的用它來處理文本,比如檢查 email 或者手機号格式,在抓取的網頁中比對需要的資料等等。
正規表達式有哪些内容? 學習正規表達式主要需要掌握以下幾個概念(不一定全): 元字元 字元轉義 錨點 零寬斷言 反向引用 選項 這裡簡單講一下元字元,其他讀者自己有興趣再自己去學習。 字元串的開始可以用 ^ 指定,結束用 $ ,是以比對全數字的字元串可以用 ^[0-9]$ ,其中中括号表示是其中一個, 0-9 是 0123456789 的簡寫,也可以寫成 \d ,不過可能有些地方不支援。
常用的特殊代碼 | |
代碼 / 文法 | 說明 |
. | 比對除換行符以外的任意字元 |
\w | 比對字母或數字 |
\s | 比對任意的空白符 |
\d | 比對數字 |
\b | 比對單詞的開始或結束 |
^ | 比對字元串的開始 |
$ | 比對字元串的結束 |
按照上面的表格,如果我們需要比對一個全數字的單詞,可以用 \b\d+\b
一些複雜的正規表達式(網上抄來的,可以借鑒一下)
比對首尾空白字元的正規表達式:^\s*|\s*$
評注:可以用來删除行首行尾的空白字元(包括空格、制表符、換頁符等等),非常有用的表達式
比對Email位址的正規表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
評注:表單驗證時很實用
比對網址URL的正規表達式:[a-zA-z]+://[^\s]*
評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求
比對帳号是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
評注:表單驗證時很實用
比對國内電話号碼:\d{3}-\d{8}|\d{4}-\d{7}
評注:比對形式如 0511-4405222 或 021-87888822
比對騰訊QQ号:[1-9][0-9]{4,}
評注:騰訊QQ号從10000開始
比對中國郵政編碼:[1-9]\d{5}(?!\d)
評注:中國郵政編碼為6位數字
比對身份證:\d{15}|\d{18}
評注:中國的身份證為15位或18位
比對ip位址:\d+\.\d+\.\d+\.\d+
評注:提取ip位址時有用
如何進一步學習?
1. http://deerchao.net/tutorials/regex/regex-1.htm 2. 《正規表達式之道》 3. 《 Mastering Regular Expressions (精通正規表達式)》