Golang中正則表達(dá)式語法及相關(guān)示例
1. Golang中的正則表達(dá)式包
Golang提供了內(nèi)置的regexp包,用于處理正則表達(dá)式操作。該包提供正則表達(dá)式對(duì)象,可以執(zhí)行各種文本操作,如匹配、查找和替換。

Golang中的regexp包提供了一組函數(shù)和類型,用于處理正則表達(dá)式。以下是一些常用的函數(shù):
- regexp.Compile : 編譯正則表達(dá)式,返回正則對(duì)象。
- regexp.Match : 判斷文本是否與正則表達(dá)式匹配。
- regexp.FindString : 查找并返回第一個(gè)匹配的字符串。
- regexp.FindAllString : 查找并返回所有匹配的字符串。
- regexp.ReplaceAllString : 替換所有匹配的字符串。
2. 正則表達(dá)式語法簡(jiǎn)述
在使用正則表達(dá)式時(shí),了解其語法規(guī)則至關(guān)重要。以下是一些常用的正則表達(dá)式元字符及其含義:
.: 匹配任意字符,除了換行符。*: 匹配前一個(gè)字符零次或多次。+: 匹配前一個(gè)字符一次或多次。?: 匹配前一個(gè)字符零次或一次。\d: 匹配數(shù)字字符。\w: 匹配字母、數(shù)字或下劃線。[]: 字符集,匹配括號(hào)內(nèi)的任意一個(gè)字符。
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 := "這是一個(gè)鏈接文本: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中第一個(gè)匹配reg的字符串
data := reg.Find([]byte(str))
fmt.Println(string(data))
//----------- FindAll 使用 ---------------//
//返回 str中所有匹配reg的字符串, 第二個(gè)參數(shù)表示最多返回的個(gè)數(shù),傳-1表示返回所有結(jié)果
dataSlice := reg.FindAll([]byte(str), -1)
for _, v := range dataSlice {
fmt.Println(string(v))
}
FindIndex 獲取索引位
//------------- FindIndex ----------------//
str := "00start123endhahastart120PSend09start10000end"
// 返回第一個(gè)匹配的字符串的首末位置
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))
// 以下兩個(gè)方法是類似的,獲取索引位
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ù)的標(biāo)點(diǎn)符號(hào)
reg = regexp.MustCompile(`[\pP]+`)
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["!" "."]
// 查找連續(xù)的非標(biāo)點(diǎn)符號(hào)字符
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包可以輕松實(shí)現(xiàn)各種文本操作。無論是從文本中提取信息還是進(jìn)行驗(yàn)證,正則表達(dá)式都是編程中不可或缺的一部分。
到此這篇關(guān)于Golang中正則表達(dá)式語法及相關(guān)示例的文章就介紹到這了,更多相關(guān)Golang正則表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Go 語言入門學(xué)習(xí)之正則表達(dá)式
- Golang棧結(jié)構(gòu)和后綴表達(dá)式實(shí)現(xiàn)計(jì)算器示例
- 一文帶你全面掌握Go語言中的正則表達(dá)式
- Go語句與表達(dá)式案例手冊(cè)深度解析
- 在?Go?語言中使用?regexp?包處理正則表達(dá)式的操作
- Go語言實(shí)戰(zhàn)之詳細(xì)掌握正則表達(dá)式的應(yīng)用與技巧
- Go語言利用正則表達(dá)式處理多行文本
- Go中regexp包常見的正則表達(dá)式操作
- Go正則表達(dá)式匹配字符串,替換字符串方式
- Go語言結(jié)合正則表達(dá)式實(shí)現(xiàn)高效獲取數(shù)據(jù)
- Go expr 通用表達(dá)式引擎的使用
相關(guān)文章
使用Go語言實(shí)現(xiàn)簡(jiǎn)單聊天系統(tǒng)
本文介紹了如何使用Go語言和WebSocket技術(shù)構(gòu)建一個(gè)簡(jiǎn)單的多人聊天室系統(tǒng),包括客戶端連接管理、消息廣播和并發(fā)處理,最后,通過編寫main.go、hub.go和client.go等核心代碼模塊,具有一定的參考價(jià)值,感興趣的可以了解一下2024-10-10
go標(biāo)準(zhǔn)庫net/http服務(wù)端的實(shí)現(xiàn)示例
go的http標(biāo)準(zhǔn)庫非常強(qiáng)大,本文主要介紹了go標(biāo)準(zhǔn)庫net/http服務(wù)端,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
一文帶你使用golang手?jǐn)]一個(gè)websocket中間件
這篇文章主要為大家詳細(xì)介紹了如何使用golang手?jǐn)]一個(gè)websocket中間件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以參考一下2023-12-12
用Go語言標(biāo)準(zhǔn)庫實(shí)現(xiàn)Web服務(wù)之創(chuàng)建路由
在上一節(jié)中創(chuàng)建了項(xiàng)目,這篇文章主要介紹如何用Go語言標(biāo)準(zhǔn)庫創(chuàng)建路由,文中有詳細(xì)的代碼示例,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可以參考下2023-05-05
Golang HashMap實(shí)現(xiàn)原理解析
HashMap是一種基于哈希表實(shí)現(xiàn)的鍵值對(duì)存儲(chǔ)結(jié)構(gòu),它通過哈希函數(shù)將鍵映射到數(shù)組的索引位置,支持高效的插入、查找和刪除操作,這篇文章主要介紹了Golang HashMap實(shí)現(xiàn)原理,需要的朋友可以參考下2025-04-04
Go語言實(shí)戰(zhàn)之實(shí)現(xiàn)均衡器功能
這篇文章主要為大家詳細(xì)介紹了如何利用Golang?實(shí)現(xiàn)一個(gè)簡(jiǎn)單的流浪均衡器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-04-04
golang 刪除切片的某個(gè)元素及剔除切片內(nèi)的零值方式
這篇文章主要介紹了golang 刪除切片的某個(gè)元素及剔除切片內(nèi)的零值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
Go與Redis實(shí)現(xiàn)分布式互斥鎖和紅鎖
這篇文章主要介紹了Go與Redis實(shí)現(xiàn)分布式互斥鎖和紅鎖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Go語言實(shí)現(xiàn)多協(xié)程文件下載器的過程詳解
這篇文章主要介紹了Go語言實(shí)現(xiàn)多協(xié)程文件下載器的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-08-08

