遙想當年初探 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