正則表達式在Go字符串處理中的實戰(zhàn)應(yīng)用代碼
前言
在 Go 語言的字符串處理領(lǐng)域,正則表達式是功能強大的工具,能夠?qū)崿F(xiàn)復雜的文本匹配、查找、替換等操作。雖然初次接觸正則表達式時,其語法可能顯得復雜,但掌握之后,它能極大地提升文本處理效率。接下來,我們通過實際案例深入探討正則表達式在 Go 字符串處理中的應(yīng)用。
一、Go 語言中的正則表達式庫
Go 語言通過regexp包支持正則表達式操作。使用前,需要導入該包:
import "regexp"
regexp包提供了編譯正則表達式、匹配字符串、查找子串、替換字符串等功能。
二、基本匹配
(一)簡單字符匹配
假設(shè)要判斷一個字符串是否包含特定單詞,如 "hello"。示例代碼如下:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "hello, world"
match, _ := regexp.MatchString("hello", str)
if match {
fmt.Println("字符串包含hello")
} else {
fmt.Println("字符串不包含hello")
}
}
這里使用regexp.MatchString函數(shù),它接收兩個參數(shù):正則表達式和要匹配的字符串。如果字符串中包含與正則表達式匹配的子串,返回true,否則返回false。
(二)字符類匹配
正則表達式中的字符類可以匹配一組字符中的任意一個。例如,要匹配一個數(shù)字,可以使用[0-9]。示例如下:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "age: 25"
match, _ := regexp.MatchString("[0-9]", str)
if match {
fmt.Println("字符串包含數(shù)字")
} else {
fmt.Println("字符串不包含數(shù)字")
}
}
[0-9]表示匹配 0 到 9 之間的任意一個數(shù)字字符。
三、查找子串
(一)查找所有匹配項
使用regexp.Regexp類型的FindAllString方法可以查找字符串中所有匹配正則表達式的子串。例如,要查找字符串中的所有數(shù)字:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "prices: $10, $20, $30"
re := regexp.MustCompile("[0-9]+")
matches := re.FindAllString(str, -1)
fmt.Println(matches) // 輸出: [10 20 30]
}
regexp.MustCompile用于編譯正則表達式,如果編譯失敗會導致程序崩潰,適用于已知正則表達式正確的情況。FindAllString的第二個參數(shù)-1表示返回所有匹配項。
(二)查找并提取分組
正則表達式中的分組可以用于提取匹配字符串的特定部分。例如,要從郵箱地址中提取用戶名和域名:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "user@example.com"
re := regexp.MustCompile(`([a-zA-Z0-9_.+-]+)@([a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)`)
matches := re.FindStringSubmatch(str)
if len(matches) > 0 {
fmt.Println("用戶名:", matches[1])
fmt.Println("域名:", matches[2])
}
}
([a-zA-Z0-9_.+-]+)和([a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)是兩個分組,FindStringSubmatch會返回包含所有匹配項及分組內(nèi)容的切片。
四、替換字符串
使用regexp.Regexp類型的ReplaceAllString方法可以將匹配正則表達式的子串替換為指定字符串。例如,將字符串中的所有數(shù)字替換為 "#":
package main
import (
"fmt"
"regexp"
)
func main() {
str := "prices: $10, $20, $30"
re := regexp.MustCompile("[0-9]+")
newStr := re.ReplaceAllString(str, "#")
fmt.Println(newStr) // 輸出: prices: $#, $#, $#
}
五、復雜案例:驗證電話號碼格式
假設(shè)要驗證電話號碼格式,以中國手機號碼為例,其格式通常為 11 位數(shù)字,且以 1 開頭。示例代碼如下:
package main
import (
"fmt"
"regexp"
)
func main() {
phoneNumber := "13800138000"
re := regexp.MustCompile(`^1[3-9]\d{9}$`)
match := re.MatchString(phoneNumber)
if match {
fmt.Println("電話號碼格式正確")
} else {
fmt.Println("電話號碼格式錯誤")
}
}
^表示字符串開頭,$表示字符串結(jié)尾,1[3-9]\d{9}表示以 1 開頭,第二位是 3 到 9 中的一個數(shù)字,后面跟著 9 個任意數(shù)字。
六、總結(jié)
正則表達式在 Go 字符串處理中應(yīng)用廣泛,從簡單的字符匹配到復雜的文本提取、替換和驗證,都能發(fā)揮重要作用。通過合理使用regexp包提供的函數(shù)和方法,結(jié)合具體業(yè)務(wù)需求編寫正則表達式,能高效解決各種字符串處理問題。在實際應(yīng)用中,需要不斷練習和積累經(jīng)驗,才能熟練運用正則表達式 。
附:go語言 正則表達式 獲取網(wǎng)頁標簽內(nèi)的數(shù)據(jù) 示例
package main
import(
"regexp"
"fmt"
"io/ioutil"
)
func main() {
//讀取文件
f,err := ioutil.ReadFile("./spider-page/regexp-1A0001.html")
if err != nil {
fmt.Print(err)
}
str := string(f)
//獲取 <h1>標題內(nèi)的文字
reg := regexp.MustCompile(`<strong>(?s:(.*?))</strong>(.*)`)
text := reg.FindAllStringSubmatch(str, -1)
fmt.Printf("%s-%s\n",text[0][1],text[0][2]) // 上證指數(shù)-1A0001
}
獲取今天最低價格
reg = regexp.MustCompile(`<strong id="tlowprice">(?s:(.*?))</strong>`)
text = reg.FindAllStringSubmatch(str, -1)
fmt.Printf("最低價:%s\n",text[0][1]) // 最低價:2533.36
獲取今天最高價格
reg = regexp.MustCompile(`<strong id="thighprice">(?s:(.*?))</strong>`)
text = reg.FindAllStringSubmatch(str, -1)
fmt.Printf("最高價:%s\n",text[0][1]) // 最高價:2554.79
獲取當前時間
reg = regexp.MustCompile(`<span class="price" id="hexm_curPrice">(?s:(.*?))</span>`)
text = reg.FindAllStringSubmatch(str, -1)
fmt.Printf("當前價:%s\n",text[0][1]) // 當前價:2553.83
獲取當前價格
reg = regexp.MustCompile(`<p id="timeshow">(?s:(.*?))</p>`)
text = reg.FindAllStringSubmatch(str, -1)
fmt.Printf("當前時間:%s\n",text[0][1]) // 當前時間:2019年1月12日 15:00:00
返回結(jié)果
上證指數(shù)-1A0001
最低價:2533.36
最高價:2554.79
當前價:2553.83
當前時間:2019年1月12日 15:00:00
到此這篇關(guān)于正則表達式在Go字符串處理中實戰(zhàn)應(yīng)用的文章就介紹到這了,更多相關(guān)Go字符串正則表達式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
從基礎(chǔ)到高階解析Go語言中數(shù)組的應(yīng)用
在本文中,我們將從基礎(chǔ)概念、常規(guī)操作,到高級技巧和特殊操作,帶大家深入了解Go語言中數(shù)組的各個方面,感興趣的小伙伴可以跟隨小編一起學習一下2023-10-10
Golang對struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實踐
這篇文章主要為大家介紹了Golang對struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
Go語言通過chan進行數(shù)據(jù)傳遞的方法詳解
這篇文章主要為大家詳細介紹了Go語言如何通過chan進行數(shù)據(jù)傳遞的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06
golang方法中receiver為指針與不為指針的區(qū)別詳析
這篇文章主要給大家介紹了關(guān)于golang方法中receiver為指針與不為指針區(qū)別的相關(guān)資料,其實最大的區(qū)別應(yīng)該是指針傳遞的是對像的引用,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10
sublime text3解決Gosublime無法自動補全代碼的問題
本文主要介紹了sublime text3解決Gosublime無法自動補全代碼的問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01

