Golang RegExp Notes

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

Regular Expression

我不負責任的猜測,多數正常人一聽到 Regular Expression,反應應該會是

raw-image

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

留言
avatar-img
留言分享你的想法!
avatar-img
Rain Wu的沙龍
4會員
8內容數
一個初入 Golang 世界的菜鳥,希望能透過筆記的方式幫助自己釐清問題。
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex
Thumbnail
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
Thumbnail
題目:如果提供的數字在0-9之間,請以文字形式返回。輸入1、輸出 “One”
Thumbnail
題目:如果提供的數字在0-9之間,請以文字形式返回。輸入1、輸出 “One”
Thumbnail
精通 Golang 正則表達式的代碼優化。透過高效的字符串處理、動態模式生成和編譯,以及處理複雜文本匹配,將正則表達式融入你的代碼中,提升效能。
Thumbnail
精通 Golang 正則表達式的代碼優化。透過高效的字符串處理、動態模式生成和編譯,以及處理複雜文本匹配,將正則表達式融入你的代碼中,提升效能。
Thumbnail
探索 Golang 正則表達式的進階技巧。理解貪婪和非貪婪匹配,運用惰性限定符優化效能,深入分組和非捕獲分組,並優化正則表達式的性能。
Thumbnail
探索 Golang 正則表達式的進階技巧。理解貪婪和非貪婪匹配,運用惰性限定符優化效能,深入分組和非捕獲分組,並優化正則表達式的性能。
Thumbnail
我們介紹了字串和列表的索引和切片操作。索引使用方括號[]來選擇字串或列表中的特定元素,並可以使用正向索引(從0開始)或反向索引(從最後一個元素為-1)來訪問元素。切片使用方括號[]和冒號:來選擇字串或列表中的一段子序列,指定起始位置和結束位置(不包含),並可以使用步長來控制間隔。
Thumbnail
我們介紹了字串和列表的索引和切片操作。索引使用方括號[]來選擇字串或列表中的特定元素,並可以使用正向索引(從0開始)或反向索引(從最後一個元素為-1)來訪問元素。切片使用方括號[]和冒號:來選擇字串或列表中的一段子序列,指定起始位置和結束位置(不包含),並可以使用步長來控制間隔。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News