Golang中正則表達式語法及相關(guān)示例
1. Golang中的正則表達式包
Golang提供了內(nèi)置的regexp包
,用于處理正則表達式操作。該包提供正則表達式對象,可以執(zhí)行各種文本操作,如匹配、查找和替換。
Golang中的regexp包
提供了一組函數(shù)和類型,用于處理正則表達式。以下是一些常用的函數(shù):
- regexp.Compile : 編譯正則表達式,返回正則對象。
- regexp.Match : 判斷文本是否與正則表達式匹配。
- regexp.FindString : 查找并返回第一個匹配的字符串。
- regexp.FindAllString : 查找并返回所有匹配的字符串。
- regexp.ReplaceAllString : 替換所有匹配的字符串。
2. 正則表達式語法簡述
在使用正則表達式時,了解其語法規(guī)則至關(guān)重要。以下是一些常用的正則表達式元字符及其含義:
.
: 匹配任意字符,除了換行符。*
: 匹配前一個字符零次或多次。+
: 匹配前一個字符一次或多次。?
: 匹配前一個字符零次或一次。\d
: 匹配數(shù)字字符。\w
: 匹配字母、數(shù)字或下劃線。[]
: 字符集,匹配括號內(nèi)的任意一個字符。
3. 相關(guān)示例
郵箱匹配
package main import ( "fmt" "regexp" ) func main() { text := "郵箱是 demo@qq.com 。" re := regexp.MustCompile(`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}`) matches := re.FindStringSubmatch(text) if len(matches) > 0 { fmt.Println("匹配的郵箱地址:", matches[0]) } }
匹配 URL
text := "這是一個鏈接文本:https://www.163.com 和 https://www.google.com" re := regexp.MustCompile(`https?://[^\s]+`) matches := re.FindAllString(text, -1) for _, match := range matches { fmt.Println("匹配的鏈接:", match) }
數(shù)字、漢字、拼音的匹配
reg1 := regexp.MustCompile(`[0-9]+`) //正則 匹配數(shù)字 reg2 := regexp.MustCompile(`[\p{Han}]+`) //正則 匹配漢字 reg3 := regexp.MustCompile(`[a-z]+`) //正則 匹配拼音
通過 Find 匹配(傳入[]byte,返回[]byte)
//----------- Find 使用 -----------------// str := "ab001234hah120210a880218end" reg := regexp.MustCompile("\\d{6}") //六位連續(xù)的數(shù)字 // 返回str中第一個匹配reg的字符串 data := reg.Find([]byte(str)) fmt.Println(string(data)) //----------- FindAll 使用 ---------------// //返回 str中所有匹配reg的字符串, 第二個參數(shù)表示最多返回的個數(shù),傳-1表示返回所有結(jié)果 dataSlice := reg.FindAll([]byte(str), -1) for _, v := range dataSlice { fmt.Println(string(v)) }
FindIndex 獲取索引位
//------------- FindIndex ----------------// str := "00start123endhahastart120PSend09start10000end" // 返回第一個匹配的字符串的首末位置 reg := regexp.MustCompile("start\\d*end") //start開始,end結(jié)束,中間全是數(shù)字 // index[0]表示開始位置,index[1]表示結(jié)束位置 index := reg.FindIndex([]byte(str)) fmt.Println("start:", index[0], ",end:", index[1], str[index[0]:index[1]]) //------------- FindAllIndex ----------------// // 返回所有匹配的字符串首末位置 indexSlice := reg.FindAllIndex([]byte(str), -1) for _, v := range indexSlice { fmt.Println("start:", v[0], ",end:", v[1], str[v[0]:v[1]]) }
FindString 操作更方便
//-----------FindString 和 FindAllString ----------------// str := "ab001234hah120210a880218end" reg := regexp.MustCompile("\\d{6}") //六位連續(xù)的數(shù)字 fmt.Println(reg.FindString(str)) fmt.Println(reg.FindAllString(str, -1)) // 以下兩個方法是類似的,獲取索引位 fmt.Println(reg.FindStringIndex(str)) fmt.Println(reg.FindIndex([]byte(str))) // 查找漢字 str1 := "hello中國hello世界和平hi好" reg1 := regexp.MustCompile("[\\p{Han}]+") fmt.Println(reg1.FindAllString(str1, -1)) // [中國 世界和平 好] // 查找數(shù)字或小寫字母 str2 := "HAHA00azBAPabc09FGabHY99" reg2 := regexp.MustCompile("[\\d|a-z]+") fmt.Println(reg2.FindAllString(str2, -1)) // [00az abc09 ab 99] //----------- ReplaceAllString ----------------// // 查找并替換 str3 := "Welcome for Beijing-Tianjin CRH train" reg3 := regexp.MustCompile(" ") fmt.Println(reg.ReplaceAllString(str3, "@")) //將空格替換為@字符 // Welcome@for@Beijing-Tianjin@CRH@train
常用匹配
text := `Hello 世界!123 Go.` // 查找連續(xù)的小寫字母 reg := regexp.MustCompile(`[a-z]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1) // 輸出結(jié)果["ello" "o"] // 查找連續(xù)的非小寫字母 reg = regexp.MustCompile(`[^a-z]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["H" " 世界!123 G" "."] // 查找連續(xù)的單詞字母 reg = regexp.MustCompile(`[\w]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "123" "Go"] // 查找連續(xù)的非單詞字母、非空白字符 reg = regexp.MustCompile(`[^\w\s]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界!" "."] // 查找連續(xù)的大寫字母 reg = regexp.MustCompile(`[[:upper:]]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["H" "G"] // 查找連續(xù)的非 ASCII 字符 reg = regexp.MustCompile(`[[:^ascii:]]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界!"] // 查找連續(xù)的標點符號 reg = regexp.MustCompile(`[\pP]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["!" "."] // 查找連續(xù)的非標點符號字符 reg = regexp.MustCompile(`[\PP]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界" "123 Go"] // 查找連續(xù)的漢字 reg = regexp.MustCompile(`[\p{Han}]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界"] // 查找連續(xù)的非漢字字符 reg = regexp.MustCompile(`[\P{Han}]+`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello " "!123 Go."] // 查找 Hello 或 Go reg = regexp.MustCompile(`Hello|Go`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"] // 查找行首以 H 開頭,以空格結(jié)尾的字符串 reg = regexp.MustCompile(`^H.*\s`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界!123 "] // 查找行首以 H 開頭,以空白結(jié)尾的字符串(非貪婪模式) reg = regexp.MustCompile(`(?U)^H.*\s`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello "] // 查找以 hello 開頭(忽略大小寫),以 Go 結(jié)尾的字符串 reg = regexp.MustCompile(`(?i:^hello).*Go`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界!123 Go"] // 查找 Go. reg = regexp.MustCompile(`\QGo.\E`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Go."] // 查找從行首開始,以空格結(jié)尾的字符串(非貪婪模式) reg = regexp.MustCompile(`(?U)^.* `) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello "] // 查找以空格開頭,到行尾結(jié)束,中間不包含空格字符串 reg = regexp.MustCompile(` [^ ]*$`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // [" Go."] // 查找“單詞邊界”之間的字符串 reg = regexp.MustCompile(`(?U)\b.+\b`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" " 世界!" "123" " " "Go"] // 查找連續(xù) 1 次到 4 次的非空格字符,并以 o 結(jié)尾的字符串 reg = regexp.MustCompile(`[^ ]{1,4}o`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"] // 查找 Hello 或 Go reg = regexp.MustCompile(`(?:Hell|G)o`) fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"] // 查找 Hello 或 Go,替換為 Hellooo、Gooo reg = regexp.MustCompile(`(?PHell|G)o`) fmt.Printf("%q\n", reg.ReplaceAllString(text, "${n}ooo")) // "Hellooo 世界!123 Gooo." // 交換 Hello 和 Go reg = regexp.MustCompile(`(Hello)(.*)(Go)`) fmt.Printf("%q\n", reg.ReplaceAllString(text, "$3$2$1")) // "Go 世界!123 Hello." reg = regexp.MustCompile(`[\f\t\n\r\v\123\x7F\x{10FFFF}\\\^\$\.\*\+\?\{\}\(\)\[\]\|]`) fmt.Printf("%q\n", reg.ReplaceAllString("\f\t\n\r\v\123\x7F\U0010FFFF\\^$.*+?{}()[]|", "-"))
4. 總結(jié)
在Golang中,使用regexp包
可以輕松實現(xiàn)各種文本操作。無論是從文本中提取信息還是進行驗證,正則表達式都是編程中不可或缺的一部分。
到此這篇關(guān)于Golang中正則表達式語法及相關(guān)示例的文章就介紹到這了,更多相關(guān)Golang正則表達式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go標準庫net/http服務(wù)端的實現(xiàn)示例
go的http標準庫非常強大,本文主要介紹了go標準庫net/http服務(wù)端,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07用Go語言標準庫實現(xiàn)Web服務(wù)之創(chuàng)建路由
在上一節(jié)中創(chuàng)建了項目,這篇文章主要介紹如何用Go語言標準庫創(chuàng)建路由,文中有詳細的代碼示例,對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可以參考下2023-05-05golang 刪除切片的某個元素及剔除切片內(nèi)的零值方式
這篇文章主要介紹了golang 刪除切片的某個元素及剔除切片內(nèi)的零值方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04Go語言實現(xiàn)多協(xié)程文件下載器的過程詳解
這篇文章主要介紹了Go語言實現(xiàn)多協(xié)程文件下載器的相關(guān)資料,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-08-08