1. 程式人生 > >快速入門“正則表示式”

快速入門“正則表示式”

導讀

  像大多數的數學表示式一樣,正則表示式也是一箇中很“反人性”的表示式,相信很多人看正則表示式跟看天書一樣,即使學習和使用過正則表示式,也很快就忘了它的規則。而本文的目的就是讓普通人能夠輕鬆快速地瞭解正則表示式,並把握正則表示式的設計哲學,不會那麼容易就忘記。
  注意,為簡單起見,本文並不會介紹“正則表示式”的全部規則,而只是介紹一些常用規則,以應付日常的搜尋和程式設計需要。如果想要更進一步學習正則表示式,可以先繼續閱讀 正則表示式30分鐘入門,本文也參考了該博文。如果你需要設計一些複雜的正則表示式,除了 google ,你還可以使用 正則表示式手冊 。如果你想檢驗自己設計的正則表示式是否正確,你可以使用

正則表示式-線上工具,這個工具還提供生成程式碼的功能,非常實用。如果你使用 Python,你還可以參考 Python 正則表示式指南菜鳥教程:Python 正則表示式。學習完本文,並配合這些網路資源,足以讓你對付日常對正則表示式的需求。

正則表示式的設計哲學

  普通人對正則表示式“無法理解”和“不能記住”的原因是:正則表示式與自然語言的設計哲學完全不同,它很“反人性”。但是,如果你瞭解了正則表示式的設計哲學,那麼你將能很好沿著這個脈絡牢牢地掌握正則表示式,而不會覺得“難以理解”和“輕易忘記”。因此,我將它放在最開始進行介紹。

設計哲學一:

以字元(char)為單位進行匹配,引入萬用字元

  自然語言是以單詞(word)為單位,而正則表示式是以字元(char)為單位。我們需要牢記,正則表示式是對單個字元(char)的匹配,比如,萬用字元,它只能匹配一個字元。我們熟知的在 Linux 或 Windows 命令列中的萬用字元——星號“※”或者問號“❓”,它實際上是正則表示式中的萬用字元+限定符的簡寫,它把真正的萬用字元點號“dot”省略了。
  而字串(string or char array)匹配、分支匹配和分組匹配都是在字元匹配的基礎上進行延伸。

設計哲學二:

多種組合方式:字元連續排列、字元(串)重複、邏輯或

  真正讓正則表示式產生威力的是它對單個字元的組合方式,如下:

  • 字元連續排列 - 仿照自然語言,由字母到單詞
  • 字元(串)重複 - 引入“限定符”,表明重複的次數
  • 邏輯或 - 引入字符集[a-z0-9]和分支語句,表達邏輯或

  當然,這些組合方式除了應用在單個字元上,也可以擴充套件到字串和分組上面,從而能夠匹配各種複雜的東西。

設計哲學三:

反義匹配:一般小寫表示正向匹配,大寫表示反義匹配

  對於大多數萬用字元,正則表示式式還提供反義匹配符,類似於“邏輯非”的功能。比如:

萬用字元 作用 反義符
\b 匹配一個單詞邊界(boundary),也就是指單詞和空格間的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er” \B
\d 匹配一個數字字元。等價於[0-9] \D
\s 匹配任何空白字元,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。 \S
\w 匹配包括下劃線在內的任何單詞字元。等價於“[A-Za-z0-9_]” \W

設計哲學四:

貪婪匹配與懶惰匹配,預設使用貪婪匹配,加問號開啟懶惰匹配

  正則表示式預設使用貪婪匹配,也就是說匹配儘可能多的的一串字元;如果要限定更小的範圍,可以通過新增限定符“?”,關閉貪婪匹配。

正則表示式規則樹

  熟悉了正則表示式的設計哲學後,我們再來從總體上看看正則表示式的規則,將它以語法樹的形式展現出來:
正則表示式規則樹

正則表示式速查

  閱讀完上面的內容,已經對正則表示式有了大概的認識,再配合正則表示式的速查資料,你就可以輕鬆掌握常用的正則表示式了。