關於正則的一點總結
正則表示式(Regular Expression)是用於描述一組字串特徵的模式,用來匹配特定的字串。通過特殊字元+普通字元來進行模式描述,從而達到文字匹配目的工具。類似於生活中常見的尋人啟示,通過描述一個人的特徵來進行“搜尋匹配”
如今正則已經被我們廣泛應用,目前被整合到了各種文字編輯器/文字處理工具當中
應用場景
- 驗證: 表單提交時,進行使用者名稱密碼驗證。
- 查詢: 從大量資訊中快速提取指定內容。在一批url中,查詢指定url
- 替換: 將指定格式的文字,進行正則匹配查詢,找到之後進行特定替換,(vim文字替換等)
在很多技術領域(比如,自然語言處理,資料儲存等),正則表示式可以很方便的提取出我們想要的資訊,所以這部分必不可少
構成基本要素
- 字元類
- 數量限定符
- 位置限定符
- 特殊符號
1. 字元類:
字元 | 說明 | 舉例 |
---|---|---|
. | 匹配任意的 一個 字元 | abc . 可以匹配abcd、abc0等 |
[] | 匹配 [] 內的任意一個字元 | [012]a可以匹配0a、1a、2a |
- | 在括號內表示字元範圍 | 如[0-9]可以匹配任何一個數字 |
^ | 放在[]內前面表示匹配除括號中字元外的任意一個字元 | [^ab]c可以匹配1c、dc,但是不能匹配ac、bc |
[[:xxx:]] | grep工具預定義的一些命名字元類 | [[:digit:]]可以匹配一個數字,[[:alpha:]]匹配一個字元,[[:lower:]]匹配任何一個小寫字母等 |
應用:
注意:使用 . 預設為貪心匹配,和後面的正則匹配方式相關,後面再述。
2. 數量限定符:
字元 | 說明 | 舉例 |
---|---|---|
? | 匹配緊跟它前面的單元(前面的一個數字或字元) 0或1次 | 如匹配小數,用 0\.?[0-9] 匹配0.1 、0.2、0.3等;由於 . 在正則裡面是特殊符號所以需要用 \ 進行轉義操作(後面再說) |
+ | 匹配緊跟它前面的單元 1或多次 | [a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.com 匹配一個郵箱地址 |
* | 匹配緊跟它前面的單元0或多次 | [0-9][0-9] *匹配至少一位數字,等價於[0-9]+ |
{N} | 精確匹配緊跟它前面的單元N次 | [0-9]{3}匹配000到999之間的數字 |
{N,} | 匹配緊跟它前面的單元至少N次 | [0-9]{3,}匹配三位及其以上的數字 |
{,M} | 匹配緊跟它前面的單元最多M次 | [0-9]{,1}等價於 [0-9]? |
{N,M} | 匹配緊跟它前面的單元N~M次 | 近似匹配IP地址: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} |
應用:
3. 位置限定符:
字元 | 說明 | 舉例 |
---|---|---|
^ | 匹配行首位置,從行首開始匹配 | ^world 只匹配一行開頭的world |
$ | 匹配行末位置,從行末尾開始匹配 | ;$ 匹配一行末尾的;號, ^$ 匹配空行 |
< | 匹配 單詞開始 位置 | < th匹配 this,不匹配teach、ethernet |
\> | 匹配 單詞末尾 位置 | p\>匹配sleep、leap等,不匹配parent、sleepy |
\b | 匹配單詞的開始位置、末尾位置 | 如 \borld 匹配world、aorld, \borld\b 只匹配orld |
\B | 匹配非單詞的開頭、末尾位置 | 如 \Bat\B匹配battery,不匹配attend、hat等以字串"at"開頭、結尾的單詞 |
注意:其中 \b 用來限定是目標串中是否有以指定字串開頭的單詞,我們稱之為詞界。 \B 稱之為非詞界
應用:
4. 特殊符號:
字元 | 說明 | 舉例 |
---|---|---|
\ | 轉義字元,普通字元轉義為特殊字元,特殊字元轉義為普通字元 | <寫成<匹配單詞開頭,.前面加上\寫成 \. 取 . 的字面值 |
() | 將正則表示式的一部分括起來組成一個單元,可以對整個單元使用數量限定符 | ([0-9]{1,3}\.){3}[0-9]{3}匹配IP地址 |
| | 連線兩個子表示式,表示或的關係 | n(o|either)匹配no或neither |
應用:
( )將包含內容括起來作為一個整體,進而通過數量限定符限定。

|用來級聯多個條件,只要有任意一個匹配,即可匹配,表示或者關係,我們稱之為 析取符 ,

正則表示式版本
其他常用通用字符集及其替換
符號 | 等價於 | 匹配 |
---|---|---|
\d | [0-9] | 數字字元 |
\D | [^0-9] | 非數字字元 |
\w | [a-zA-Z0-9_] | 數字字母下劃線 |
\W | [^\w] | 非數字字母下劃線 |
\s | [_\r\t\n\f] | 表格,換行等空白區域 |
\S | [^\s] | 非空白區域 |
於是, 我們現在可以用這些符號來簡化我們正則表示式的編寫了?試試

可是結果好像並不如我們所願?其實這裡還與正則表示式版本有關。正則分為以下幾個版本:
- 基本的正則表示式(Basic Regular Expression 又叫 Basic RegEx 簡稱 BREs)
- 擴充套件的正則表示式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)
- Perl 的正則表示式(Perl Regular Expression 又叫 Perl RegEx 簡稱 PREs)
在grep中指定相應的引數即可,而這幾個版本中預設的就是基本正則,帶上-E選項就是擴充套件正則,而帶上-P引數就是用perl版正則。解決前面的問題,我們這裡讓grep帶上-P選項便可解決了
版本間區別
- 正則表示式的Extended規範和Basic規範基本相同。只是在Basic規範下,有些字元 ?+{}|() 應解釋為普通字元,要表示上述特殊含義則需要加 轉義。
- 反之,在Extended規範下, ?+{}|() 應該被理解成特殊含義,要取其字面值,也要對其進行 轉義。
- 所以, grep 工具帶上 -E 選項,表示使用擴充套件正則來進行匹配,若沒有,則表示使用基準正則進行匹配。亦或者直接使用 egrep 命令操作
- 帶-P選項使用的 ofollow,noindex" target="_blank">perl正則匹配 是perl語言的整合一種最重要特性,它十分強大,很多語言設計正則式支援的時候基本上都參考Perl的正則表示式。
正則匹配模式
- 貪婪模式
貪婪模式
- 非貪婪模式
非貪婪模式
總結:可以看到,非貪婪模式的識別符號,就是貪婪模式的識別符號後面加上一個 ?