每個人都能用點正則表示式

語言: CN / TW / HK

有一個關於正則表示式的笑話是這麼說的:我們遇到了一個問題,用正則表示式解決了,現在變成了兩個問題。

這個笑話說明了正則表示式的複雜,有時還難以維護。如果我們剛接觸一個現有的專案,裡面出現了正則表示式,我們的第一反應肯定是頭疼。因為正則表示式不易讀,通常要讀好幾遍才能稍微弄懂他的意圖。

包括我也一樣,在很長一段時間裡,我對正則表示式的態度是能不用就不用。直到幾年前我讀完了《精通正則表示式》這本書,我對正則表示式的態度發生了巨大的變化。

這本書的第一章的第一節名字是「解決實際問題」,我在這第一節就領略到了正則表示式的魅力。也讓我意識到, 你不一定需要正則表示式,但你必需掌握正則表示式的基礎,克服對它的恐懼,把它轉化成你的工具之一。 在以後,當你又遇到一個問題,你就會意識到正則表示式是其中的一種優雅的解法。當你把正則表示式作為自己的一種工具後,你會發現一些以前你認為需要寫一段程式去解決的問題,其實只需要一行正則表示式就能解決。

例如,我通常想要把一個 JSON 檔案轉換成一個 JavaScript 物件,我想要把 JSON 裡的 key 的雙引號去掉。以前我可能會先 Google 一下 "JSON to JavaScript object" 看看有沒有現成的工具,而現在我首先就會想到,這個問題用正則表示式配合編輯器自帶的替換功能就能解決。

假設這是我們想要轉換的 JSON:

{
  "name": "Randy",
  "children": [
    {
      "name": "Sandy"
    },
    {
      "name": "Mandy"
    }
  ]
}

我的思路會是:首先我要匹配出所有的 key, 而 key 的特徵是以雙引號開頭,以雙引號結尾,後面一定會帶上一個冒號,所以我可以用這樣一句正則把所有的 key 找出來:

".+":

這裡的 . 表示任意字元, + 則表示匹配一個或多個。

正則表示式其中一個強大的特性是可以把某一個匹配用括號包起來,讓它變成一個 group, 這些 group 會以數字編號,從 1 開始。這樣我們可以在匹配後,用 $1 這樣的形式把匹配到的 group 的值拿出來再處理。在這個例子中,我們用 VS Code 的替換功能,把 key 匹配出來,然後把它放在一個 group 裡,在替換的時候,再用 $1 得到 key 的值,用作替換:

"(.+)":

還有很多例子,讀者可以舉一反三。這篇文章的目的不是教大家正則表示式的用法,而是讓大家能意識到,正則表示式是一個很實用的工具,不一定要在專案中用到,在日常的一些文字處理任務中,它能發揮出你意想不到的作用。而正則表示式的基本用法不難記,多用幾次就會爛熟於心。當然更高階的用法,也是需要多翻手冊的。