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
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
re 模組基本介紹 re 模組是 Python 用來處理正則表達式的標準模組。 正則表達式是一種用於描述字串模式的語法,可以用來匹配、搜尋、分割和替換字串中的特定模式。
Thumbnail
題目敘述 Minimum Deletions to Make String Balanced 給定一個只會有包含'a'b或'b'的輸入字串s。 每次操作可以任選一個字元刪除。 請問最少需要多少次操作,才會使得所有的'b'都在'a'後面? 測試範例 Example 1: Input: s
Thumbnail
1.0 從函數到函算語法 1.1 句子成份 九 屈折變化沒有標誌句子成份如何構成句子的規則﹗這是我們的另一個觀察。句子成份屬規範性的操作指引。現再返回《文通》的意見。《文通》將詞分成七種便是語法上的規範性指引。就句讀而言,《文通》說﹕ 「夫文者,集句以成,如錦繡然,故謂之文。欲知文,
Thumbnail
在 Google 試算表中,LEFT、MID、RIGHT 函式都是用來擷取文字字串中特定部分的函式。我想在這次的教學簡單介紹一下它們,歡迎來看看! LEFT:從左邊(開頭)取字串 我們可以用 LEFT 函式從字串的左邊(開頭)取指定字數的字串。 語法 =LEFT(字串, 要取的
Thumbnail
這篇文章,會帶著大家複習以前學過的 區間DP框架, 並且以回文子字串、回文子序列的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 回文字串的基本定義 s = s[::-1] 也就是說字串s的正序 和 逆序完全相同。 回文字串的基本結構 空字串"
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
re 模組基本介紹 re 模組是 Python 用來處理正則表達式的標準模組。 正則表達式是一種用於描述字串模式的語法,可以用來匹配、搜尋、分割和替換字串中的特定模式。
Thumbnail
題目敘述 Minimum Deletions to Make String Balanced 給定一個只會有包含'a'b或'b'的輸入字串s。 每次操作可以任選一個字元刪除。 請問最少需要多少次操作,才會使得所有的'b'都在'a'後面? 測試範例 Example 1: Input: s
Thumbnail
1.0 從函數到函算語法 1.1 句子成份 九 屈折變化沒有標誌句子成份如何構成句子的規則﹗這是我們的另一個觀察。句子成份屬規範性的操作指引。現再返回《文通》的意見。《文通》將詞分成七種便是語法上的規範性指引。就句讀而言,《文通》說﹕ 「夫文者,集句以成,如錦繡然,故謂之文。欲知文,
Thumbnail
在 Google 試算表中,LEFT、MID、RIGHT 函式都是用來擷取文字字串中特定部分的函式。我想在這次的教學簡單介紹一下它們,歡迎來看看! LEFT:從左邊(開頭)取字串 我們可以用 LEFT 函式從字串的左邊(開頭)取指定字數的字串。 語法 =LEFT(字串, 要取的
Thumbnail
這篇文章,會帶著大家複習以前學過的 區間DP框架, 並且以回文子字串、回文子序列的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 回文字串的基本定義 s = s[::-1] 也就是說字串s的正序 和 逆序完全相同。 回文字串的基本結構 空字串"
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。