2019-03-17|閱讀時間 ‧ 約 5 分鐘

Golang RegExp Notes

遙想當年初探 Regular Expression,腦袋紮紮實實地被凌虐了一番,同時十分敬佩把正規表示式寫的簡潔有力又精確無誤的神人。最近學校在上編譯器課程,估計近期內便會接觸到不少 RegExp 的技巧,於是就來寫篇筆記吧~

Regular Expression

我不負責任的猜測,多數正常人一聽到 Regular Expression,反應應該會是
Well~ 不過如果熟練的話其實蠻實用的,雖說網路上已經一大堆人寫了相關東西,但我仍要強迫自己寫一下幫助學習。

字元
  • [12345]:1 or 2 or 3 or 4 or 5
  • [0-9]:數字
  • [a-zA-Z0-9]:數字或大小寫字母
  • b[aeiou]t:bat、bet、bit、bot 或 but
  • [^0-9]:非數字
  • [^\^]:非 ^

字串
  • a:字母 a
  • a.:字母 a 及尾隨一個任意字元
  • ^ak:以 ak 為開頭
  • ka$:以 ka 為結尾

計數
  • a?:零個或一個 a
  • [0-9]+:一個或多個數字
  • [aeiou]*:零個或多個小寫母音字母
  • a{4}:連續四個 a
  • a{4,6}:連續 4~6 個 a
  • a{4,}:連續至少四個 a

特殊字元
  • \b:英文字的邊界,反之則為 \B
  • \d:任一數字,反之則為 \D
  • \w:任一數字或大小寫字幕或底線,反之則為 \W
  • \s:任一空白字元,反之則為 \S
  • \t:定位字元
  • \n:換行符號
好歐一些基本常用的應該都寫上了,如果覺得簡單的話,可以嘗試各種排列組合,設計出些符合生活中某些字串的 regular expression,很快就會感受到這並不是件容易的事了~XD

Golang 中的 regexp 包

Golang 的標準庫十分方便強大,我在熟悉完基本語法後,便開始學習標準庫來提升自己的開發效率和品質。而 Regular Expression 可說是近代語言不可少的標配之一,接著就來筆記一下 Golang 中 regexp 包的一些基本應用,參考自 Go by Example
這個 gist 就是最簡單的 regexp 使用方式,MatchString 可以接受兩個參數,第一個是 pattern,第二個是 string,會嘗試在 string 中匹配 pattern,並回傳一個 (bool, error) 結構,分別是是否匹配成功及發生的錯誤。
但其實可以先把 regexp 給 compile 起來方便後續使用,畢竟單純的字串是無法進行匹配工作的,仍要做些處理才能實現匹配功能,但這種 compile 的工作做一次就夠了,做太多次只是浪費資源。
Compile 會回傳一個 (*Regexp, error),分別是 Regexp 結構和編譯時的錯誤。接著我們可以對產出的 Regexp 結構呼叫其函數。
其中 MatchString 和 FindString 各自會回傳是否匹配成功及第一個匹配成功的字串,FindStringSubmatch 可回傳第一個符合整體表達式及其中滿足規則並未寫死的 字串的 slice。FindAllString 則會會傳多個匹配成功字串的 slice,第二個參數可指定數量,若為 -1 則全部回傳。
我們也可以針對 Index 方面取得更進一步的資訊。
FindStringIndex 可以回傳第一個符合整體表達式的字串的 Index 範圍,FindStringSubmatchIndex 則會再多回傳其中滿足規則並未寫死的部分的 Index 範圍。FindAllStringSubmatchIndex 則是回傳多個 Index 範圍,同樣可以藉由第二個參數指定回傳數量。
同時也可以針對匹配到的字串執行函數,這裡需要再引入 “bytes”包。
如此ㄧ來我們便能透過 bytes.ToUpper 把所有匹配成功的字串轉成大寫字母。

這次就先寫到這裡吧,Regular Expression 是門博大精深的學問,至少我是這麼覺得啦~更多詳細技巧可以參考 Document
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.