翻譯,原文來自: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引數)•字串替換•語法高亮顯示、檔案重新命名等
極客閱讀 | 匯聚了國內外最優質的技術部落格、產品動態、公眾號文章。