Golang 正則進階篇 (三):通過 Golang 正則表達式優化代碼效能

閱讀時間約 6 分鐘

歡迎閱讀本系列的最後一篇文章!在前兩篇中

Golang 正則進階篇 (一):正則語法加強版Golang 正則進階篇 (二):實際應用

我們已經學會了正則表達式的高級技巧,並且在實際應用中使用了它們。現在,我們將進一步探討如何通過 Golang 正則表達式來優化代碼效能。


高效的字符串處理

解釋如何使用正則表達式進行字符串的切割、查找等操作。

案例:

假設你有一段文本,其中包含了以逗號分隔的數字。你想將這些數字提取出來,可以使用正則表達式來高效地實現。
package main

import (
"fmt"
"regexp"
"strings"
)

func main() {
text := "1,2,3,4,5"
re := regexp.MustCompile(`\d+`)
numbers := re.FindAllString(text, -1)

fmt.Println("Numbers:", strings.Join(numbers, "+"))
}

// 輸出:
// Numbers: 1+2+3+4+5


動態模式生成與編譯

解釋如何根據運行時情況生成動態的正則表達式模式。

案例:

假設你需要根據使用者的輸入來查找文本中的關鍵字。你可以使用動態生成的正則表達式模式來實現這一目標。
package main

import (
"fmt"
"regexp"
)

func main() {
text := "apple orange banana"
keyword := "orange"
re := regexp.MustCompile(keyword)
if re.MatchString(text) {
fmt.Println("Found:", keyword)
}
}

// 輸出:
// Found: orange​


複雜文本匹配與提取

解釋如何處理複雜的文本結構,達到更精確的匹配和提取。

案例:

假設你有一個 CSV 文件,你想提取每一行中的數據字段。你可以使用正則表達式來解析這些數據。
package main

import (
"fmt"
"regexp"
"strings"
)

func main() {
csv := "John,Doe,30\nJane,Smith,25\n"
re := regexp.MustCompile(`([^,\n]+)`)
matches := re.FindAllStringSubmatch(csv, -1)

for _, match := range matches {
fmt.Println("Fields:", strings.Join(match[1:], ", "))
}
}

// 輸出:
// Fields: John
// Fields: Doe
// Fields: 30
// Fields: Jane
// Fields: Smith
// Fields: 25


預先編譯

對於經常使用的正則表達式,預先編譯是一個好習慣。它可以提高效能,同時也能確保你的正則表達式在編譯時是正確的。

案例:

假設你正在開發一個日誌分析工具,需要匹配和提取多行日誌中的時間戳。
package main

import (
"fmt"
"regexp"
)

func main() {
logContent := ` [2023-08-21 10:30:45] DEBUG: Initial log entry. [2023-08-21 10:45:23] ERROR: Something went wrong. [2023-08-21 11:00:00] INFO: All operations completed. `
re := regexp.MustCompile(`\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\]`)
timestamps := re.FindAllString(logContent, -1)

for _, timestamp := range timestamps {
fmt.Println(timestamp)
}
}

正則的效能問題

正則表達式雖然強大,但不當使用也可能造成效能問題。

案例:

考慮以下正則表達式,它試圖匹配由多個 "a" 組成的字符串,後面跟著一個 "b"。
package main

import (
"fmt"
"regexp"
"strings"
"time"
)

func main() {
re := regexp.MustCompile(`a+b`)
input := strings.Repeat("a", 50000000) + "b"
start := time.Now()
re.MatchString(input)
end := time.Now()

fmt.Printf("Matching took %v seconds.\n", end.Sub(start).Seconds())
}

這將會需要很長時間來匹配,尤其是當 "a" 的數量增加時。


小結

嗨,我們在這篇文章裡頭,聊了怎麼用 Golang 的正則表達式來提高代碼效能。我們看了怎麼更猛地處理字符串、怎麼動態地建正則模式,和怎麼搞定複雜的文本配對和抓取。哦,還有,我們提到了如何預先把正則表達式編譯好,和怎麼搞定效能問題。學了這些,你處理文本時就能更加得心應手了!


總結

最後,簡單總結下!謝謝你耐心地看完這三篇。經過這三篇,你已經從 Golang 正則的基礎跳到高手階段了!你學到怎麼用它來捕獲分組、替換、搞定非捕獲分組、更精準地匹配和提取,而且還知道怎麼提高代碼效能。現在,不論你想做日誌分析、文本解析或是字符串處理,你都已經手裡握有一把利器!繼續加油,用你學到的在真實項目上施展,持續精進吧!

avatar-img
31會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
KH Huang的沙龍 的其他內容
運用 Golang 正則表達式處理文本。從替換操作到 URL 解析,再到日誌分析,掌握實際應用場景下的正則技巧,提取、轉換和分析文本數據。
探索 Golang 正則表達式的進階技巧。理解貪婪和非貪婪匹配,運用惰性限定符優化效能,深入分組和非捕獲分組,並優化正則表達式的性能。
利用 Goroutines 實現 Observer Pattern。
運用 Golang 正則表達式處理文本。從替換操作到 URL 解析,再到日誌分析,掌握實際應用場景下的正則技巧,提取、轉換和分析文本數據。
探索 Golang 正則表達式的進階技巧。理解貪婪和非貪婪匹配,運用惰性限定符優化效能,深入分組和非捕獲分組,並優化正則表達式的性能。
利用 Goroutines 實現 Observer Pattern。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
說真話,在自閉症者記住規定,不只是死守,而且,還指出違規者的違規。 不單單是在學校,就算在醫院的病房,也是如此。 到時進職場,那還得了! 用責任制輔助自閉症者見到工作職責 基本上,像在急性病房用餐,都有護理師在監視。 而自閉症學員有記住規定,必然邊用餐邊監視。 而且,總是比護理人員早見到
Thumbnail
跟團住在號稱5星級飯店,SONO CALM GOYANG HOTEL 出發前在網路上找不到相關資料,google附近的地圖失真,於是來發一篇文 沒拍房間內部,房間還蠻大的,兩張單人床中間兩旁都有空間可以走動,開放式衣架,備品有小瓶沐浴乳、洗髮精、潤髮乳,都是濃濃的薄荷味,如果不能接受的話,最好自
Thumbnail
這款名為《國家衝突Conflict of Nations》的遊戲,如同其遊戲名,就是一款主打玩家掌權國家與其他敵對國家進行外交、戰爭等一系列行動的戰略戰爭遊戲。
Thumbnail
密技 那一天,阿郎很慎重、很嚴肅的告訴我們:「距離大學聯考剩下不到5個月了,也就是剩下不到150天了,各位即將進入最後的衝刺階段,現在各位可以選擇你最不擅長的一科放棄
Thumbnail
「鄭南榕」是個很重要的人物,這篇文章主要是預告本週三即將上船的《本刊文責一律由總編輯鄭南榕負責》之書評,並且說明為什麼我挑選這本書。
Thumbnail
建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
Thumbnail
遙想當年初探 Regular Expression,腦袋紮紮實實地被凌虐了一番,同時十分敬佩把正規表示式寫的簡潔有力又精確無誤的神人。最近學校在上編譯器課程,估計近期內便會接觸到不少 RegExp 的技巧,於是就來寫篇筆記吧~
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
說真話,在自閉症者記住規定,不只是死守,而且,還指出違規者的違規。 不單單是在學校,就算在醫院的病房,也是如此。 到時進職場,那還得了! 用責任制輔助自閉症者見到工作職責 基本上,像在急性病房用餐,都有護理師在監視。 而自閉症學員有記住規定,必然邊用餐邊監視。 而且,總是比護理人員早見到
Thumbnail
跟團住在號稱5星級飯店,SONO CALM GOYANG HOTEL 出發前在網路上找不到相關資料,google附近的地圖失真,於是來發一篇文 沒拍房間內部,房間還蠻大的,兩張單人床中間兩旁都有空間可以走動,開放式衣架,備品有小瓶沐浴乳、洗髮精、潤髮乳,都是濃濃的薄荷味,如果不能接受的話,最好自
Thumbnail
這款名為《國家衝突Conflict of Nations》的遊戲,如同其遊戲名,就是一款主打玩家掌權國家與其他敵對國家進行外交、戰爭等一系列行動的戰略戰爭遊戲。
Thumbnail
密技 那一天,阿郎很慎重、很嚴肅的告訴我們:「距離大學聯考剩下不到5個月了,也就是剩下不到150天了,各位即將進入最後的衝刺階段,現在各位可以選擇你最不擅長的一科放棄
Thumbnail
「鄭南榕」是個很重要的人物,這篇文章主要是預告本週三即將上船的《本刊文責一律由總編輯鄭南榕負責》之書評,並且說明為什麼我挑選這本書。
Thumbnail
建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
Thumbnail
遙想當年初探 Regular Expression,腦袋紮紮實實地被凌虐了一番,同時十分敬佩把正規表示式寫的簡潔有力又精確無誤的神人。最近學校在上編譯器課程,估計近期內便會接觸到不少 RegExp 的技巧,於是就來寫篇筆記吧~