Regex:沒有看起來那麼可怕
正規表達式以難讀著稱,但它們不必如此。從基礎語法到實用模式,一步步學習如何用正規表達式匹配電子郵件、驗證電話號碼和提取資料。
你需要在文件中找到所有電子郵件地址。或驗證電話號碼。或從混亂的文字中提取日期。
有人說「使用 regex」。你 Google 語法,找到像 ^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$ 這樣的東西,並立即關閉分頁。
正規表達式看起來很嚇人,因為人們寫它們是為了聰明而不是清楚。讓我們修復這個。
從字面匹配開始
Regex 找到模式。最簡單的模式是字面文字。
cat 匹配「The cat sat.」中的「cat」。沒什麼花俏的。
http 匹配任何 URL 中的「http」。仍然很直接。
逐漸添加通配符
. 匹配任何單個字符。c.t 匹配「cat」、「cot」、「cut」。
* 表示「前一個東西的零個或多個」。ca*t 匹配「ct」、「cat」、「caat」、「caaaaaat」。
+ 表示「一個或多個」。ca+t 匹配「cat」和「caat」但不匹配「ct」。
? 表示「零個或一個」。colou?r 匹配「color」和「colour」。
字符類是你的朋友
[aeiou] 匹配任何母音。[0-9] 匹配任何數字。[A-Za-z] 匹配任何字母。
\d 是 [0-9] 的簡寫。\w 匹配字字符(字母、數字、底線)。\s 匹配空白。
這些構建塊處理大多數現實世界的模式。
錨點控制位置
^ 表示「行開始」。$ 表示「行結束」。
^Hello 匹配「Hello world」但不匹配「Say Hello」。
world$ 匹配「Hello world」但不匹配「world peace」。
群組捕獲部分
括號將東西分組。它們也捕獲以供以後使用。
(\d{3})-(\d{4}) 匹配「555-1234」並分別捕獲「555」和「1234」。
這就是你如何從模式匹配中提取特定資料。
真實範例,解釋
電子郵件(簡化):
[\w.-]+@[\w.-]+\.\w+
翻譯:字字符/點/連字符,然後 @,然後更多相同的,然後一個點,然後字字符。
電話號碼:
\d{3}[-.\s]?\d{3}[-.\s]?\d{4}
翻譯:3 位數字,可選分隔符,3 位數字,可選分隔符,4 位數字。匹配「555-123-4567」、「555.123.4567」、「5551234567」。
日期 (MM/DD/YYYY):
\d{2}/\d{2}/\d{4}
翻譯:2 位數字,斜線,2 位數字,斜線,4 位數字。
常見錯誤
忘記轉義特殊字符。 . 在 regex 中表示「任何字符」。要匹配字面點,使用 \.。
太貪婪。 .* 盡可能多地匹配。對於 HTML 標籤,<b>bold</b> 上的 <.*> 匹配整個東西,而不僅僅是 <b>。使用 <.*?> 進行非貪婪匹配。
過度複雜化。 如果你需要真正驗證電子郵件,使用函式庫。「正確」的電子郵件 regex 有數百個字符長。
何時不使用 Regex
解析 HTML 或 JSON。使用適當的解析器。
複雜的驗證邏輯。程式碼通常比單個大規模模式更清楚。
當字串方法有效時。"hello".startsWith("he") 比 /^he/ 更清楚。
Regex 是一個工具。像任何工具一樣,它適合特定的工作,對其他工作來說很笨拙。從簡單開始,在建立時測試,不要試圖聰明。可讀的 regex 比令人印象深刻的 regex 更好。