文章 | 吃透 <正規表示式>(理論+多圖示例)

極客閱讀發表於2020-01-13
文章 | 吃透 <正規表示式>(理論+多圖示例)

翻譯,原文來自:Regex tutorial — A quick cheatsheet by examples[1]

掘金編輯器格式化效果不太好,可以去我們的公眾號瀏覽:

mp.weixin.qq.com/s?__biz=MzI…


通過正規表示式在從文字中提取特定模式的內容時非常有用。

它應用很廣泛,包括:驗證、解析/替換字串、資料格式轉換以及網頁爬取。

一旦你學會了它的語法,你幾乎可以在所有程式語言(JavaScript、Java、VB、C#、C/C++、Python、Perl、Ruby、Delphi、R、Tcl 等等)中使用它。

讓我們先看看一些示例和講解吧。



基礎

標記點(Anchors):^ 和 $

• ^The — 匹配任意以 The 開頭的字串

文章 | 吃透 <正規表示式>(理論+多圖示例)


• end$ — 匹配以 end 結尾的字串
• ^The end$ — 字串完整匹配 (也就是 The end)
• roar — 包含 roar 的任何字串


量詞:* + ? 和 {},即表示數量的

• abc* — 匹配 ab 並且後面跟著 0 個或多個 c 的字串

文章 | 吃透 <正規表示式>(理論+多圖示例)


• abc+ — 匹配 ab 並且後面跟著 1 個或多個 c 的字串(至少一個 c)
• abc? — 匹配 ab 並且後面跟著 0 個或 1 個 c 的字串
• abc{2} — 匹配 ab 並且後面跟著 2 個 c 的字串
• abc{2,} — 匹配 ab 並且後面跟著 2 個或更多個 c 的字串(至少 2 個)
• abc{2,5} — 匹配 ab 並且後面跟著 2 到 5 個 c 的字串
• a(bc)* — 匹配 a 並且後面跟著 0 個或多個 bc 的字串
• a(bc){2,5} — 匹配 a 並且後面跟著 2 個到 5 個 bc 的字串


或操作符:| 或 []

a(b|c) — 匹配 a 並且後面跟著 b 或 c 的字串(也就是 ab 或 ac)

文章 | 吃透 <正規表示式>(理論+多圖示例)


• a[bc] — 同上


字元類:\d \w \s 和 .

• \d — 匹配一個數字(等同於 [0-9]

文章 | 吃透 <正規表示式>(理論+多圖示例)


• \w — 匹配文字字元(word character)(注:這裡指的英文:數字、字母和下劃線。等同於 [a-zA-Z0-9_])

文章 | 吃透 <正規表示式>(理論+多圖示例)


• \s — 匹配空格符(包括製表符(tab) 和換行,等同於 [\r\n\t\f\v ]

文章 | 吃透 <正規表示式>(理論+多圖示例)


— 匹配任意字元


文章 | 吃透 <正規表示式>(理論+多圖示例)



在使用 . 時要注意,有時使用字元類(\d, \s. \w)和反字元會更快更精準。

\d, \s\w 的反義類是 \D, \W\S(大寫)。

例如:\D 得到與 \d 相反的結果。

• \D — 匹配一個非數字字元 

文章 | 吃透 <正規表示式>(理論+多圖示例)


想要匹配 ^.[$()|*+?{\ 等這些字元,要使用 \ 進行轉義。

• $\d — 匹配一個 $ 和一個數字

文章 | 吃透 <正規表示式>(理論+多圖示例)


提示:通過正規表示式可以匹配那些不可列印的字元,例如:製表符(tab)用 \t、換行用 \n、回車用 \r

標記(Flags)

正則通常以/abc/這種形式呈現,搜尋模式以兩個/進行分隔。並在結尾加上以下標記符:

• g (global) 返回所有匹配的
• m(multi-line)多行匹配,再同時使用 ^$ 時會在多行匹配,而不是按完整的字串匹配。
• i(insensitive)不區分大小寫,例如:/aBc/i 能匹配 AbC

中級

捕獲分組(Grouping and capturing): ()

• a(bc) — 用小括號建立值是 bc 的捕獲組 

文章 | 吃透 <正規表示式>(理論+多圖示例)


• a(?:bc)* — 使用 ?: 來禁用捕獲組


文章 | 吃透 <正規表示式>(理論+多圖示例)


• a(?<foo>bc) — 使用 ?<foo> 給組命名
文章 | 吃透 <正規表示式>(理論+多圖示例)



在資料提取中使用這種操作符非常實用,多個捕獲分組會以陣列形式呈現,所以可以通過索引獲取這些值。

如果我們使用組命名 (?<foo>...),我們就可以像使用字典(物件)一樣,通過鍵名來取值。


中括號表示式:[]

• [abc] — 匹配 或是 a、或是 b、或是 c 的字串(等同於:a|b|c

文章 | 吃透 <正規表示式>(理論+多圖示例)


• [a-c] — 同上•[a-fA-F0-9] — 匹配一個十六進位制數字,不區分大小寫 
文章 | 吃透 <正規表示式>(理論+多圖示例)


• [0-9]% — 匹配 % 前有一個 0 到 9 任意數字的字串•[^a-zA-Z] — 匹配不包括 a 到 z,及 A 到 Z 的字串,這裡的 ^ 是一個取反表示式 
文章 | 吃透 <正規表示式>(理論+多圖示例)




貪婪和懶惰(非貪婪)匹配

* + {}這幾個量詞就是貪婪操作符,什麼意思?就是他們會匹配儘可能多的內容。

例如:<.+> 會從 This is a <div>simple div</div> test 中匹配出 <div>simple div</div>,如果我們只想要 div 標籤,只需加上 ? 使其變成懶惰的。


• <.+?>懶惰匹配 < 和 > 裡任意字元

文章 | 吃透 <正規表示式>(理論+多圖示例)


提示:最好避免使用 .,而選擇嚴格的匹配方式。

• <[^<>]+> — 匹配在 < 和 > 裡除了 < 和 > 外的任意字元

文章 | 吃透 <正規表示式>(理論+多圖示例)



高階

邊界:\b 和 \B(也就是單詞邊界)

• \babc\b — 詞 abc

文章 | 吃透 <正規表示式>(理論+多圖示例)


\b 是和 $^ 類似的一個標記點。它的一側是單詞(\w),而另一側不是單詞(字串的起始位置或空格)。

它的反義就是 \B

• \Babc\B — 匹配有單詞包圍的 abc

文章 | 吃透 <正規表示式>(理論+多圖示例)



後向引用(Back-references):\1

• ([abc])\1 — 使用 \1 匹配和第一個捕獲組一樣的文字

文章 | 吃透 <正規表示式>(理論+多圖示例)


• ([abc])([de])\2\1 — 使用 \2 (\3, \4 等) 來匹配和第 2 個(第 3 個、第 4 個等)捕獲組一樣的文字 
文章 | 吃透 <正規表示式>(理論+多圖示例)


• (?<foo>[abc])\k<foo> — 給捕獲組命名為 foo 再通過 \k<foo> 引用他,同第一個例子結果一樣
文章 | 吃透 <正規表示式>(理論+多圖示例)



向前、向後:(?=) 和 (?<=)

• d(?=r) — 匹配 r 前面的 d,不包括 r 

文章 | 吃透 <正規表示式>(理論+多圖示例)


• (?<=r)d — 匹配 r 後面跟著的 d,不包括 r
文章 | 吃透 <正規表示式>(理論+多圖示例)


或使用反義操作

• d(?!r) — 匹配 r 後面跟著的 d,不包括 r 

文章 | 吃透 <正規表示式>(理論+多圖示例)


• (?<!r)d — 匹配 r 前面的 d,不包括 r
文章 | 吃透 <正規表示式>(理論+多圖示例)



總結

如你所見,正規表示式的應用欄位可以是多個的,估計你在開發中或多或少也用過一些,下面是幾個常見的場景:

•資料驗證(例如,檢查時間格式是否正確)•資料爬取(如網頁爬蟲,對內容的查詢)•資料整理(Data Wrangling),將原始資料轉換另一種格式•字串解析(例如,URL GET引數)•字串替換•語法高亮顯示、檔案重新命名等


極客閱讀 | 匯聚了國內外最優質的技術部落格、產品動態、公眾號文章。

官網geeker-read.com


文章 | 吃透 <正規表示式>(理論+多圖示例)


相關文章