『不再迷茫 – 正規表示式』JS正則要點梳理 持續更新

Lionad發表於2018-01-30

[TOC]

寫在前面 – Lionad

正在看VueJS的原始碼, 看到了HtmlParser部分, 感覺以前看的正規表示式基礎知識已經完全不夠用了, 現翻閱部落格資料, 將一些JS中正規表示式難用的部分總結歸納, 方便自己和sf友翻閱.

正則分組

重複匹配

對於重複的匹配, 我們經常使用到正規表示式的分組功能, 我們使用正則匹配IP地址來實踐一下.

假設我們要匹配的IP地址在區間 0.0.0.0 – 255.255.255.255 之間, 可以直觀的瞭解到, 我們只需要匹配 三位數字+點號 三遍, 再匹配三位數字一遍就可以了.

這裡說的 三位數字+點號 既是我們說的一種規則, 我們可以在表示式中將它們轉化為規則即: d{1,3}., 當我們把規則用括號包裝後, 就變成了組: (d{1,3}.), 所以匹配IP地址的正規表示式可以寫作: (d{1,3}.){3}d{1,3}

換種思路, 我們也可以這樣匹配: d{1,3}(.d{1,3}){3}

擴充: 聰明的你可能已經想到, d{1,3} 匹配是有疏漏的. 在實際生產過程中, d{1,3} 可能匹配 999 這種數字, 他是一個錯誤的IP地址段. 這裡貼上真實的IP地址正則匹配供大家參考: ((25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))).){3}(25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))) , 另人愉快的是, 它使用的分組策略仍然是不變的.

後向引用(反向引用)

我們考慮一個很特殊的情況, 當我們要匹配四個IP段相同的情況, 如 100.100.100.100 時, 重複匹配分組的策略失效了: 重複匹配分組 並不能保證匹配相同的數字 -> 這時候我們需要藉助 後向引用 策略的力量了(少年, 你渴望力量嗎2333, 戳我頭像, 帶你探索音樂與程式碼交織的文藝道路.)

後向引用在不同語言的正規表示式書寫中, 有不同的語法, 我們討論JS中最常見的一種, 形如:
umber
的後向引用, 其中, number 代表分組的序號.

給你一個簡單的栗子, 瞬間就記住了, 假使我們要匹配重複的三位數字, 我們將匹配一個數字的規則標記為一個分組: (d), 重複匹配這個分組(第一個分組)的具體內容三次: (d)1, 這樣就達到了目的.

我們很容易將重複匹配和後向引用分別開來: 前者是重複匹配相同的規則, 後者是匹配分組的具體內容.

預設的一些規則需要稍加理解並記住:

相關文章