golang正則表示式的使用詳解
阿新 • • 發佈:2018-12-19
正則表示式是一種進行模式匹配和文字操縱的功能強大的工具。正則表示式靈活、易用,按照它的語法規則,隨需構造出的匹配模式就能夠從原始文字中篩選出幾乎任何你想要得到的字元組合。使用正則表示式需引入"regexp"包,通常還需與"strings"包配合使用,推薦一篇《Go strings 字串處理包常用方法詳解》連結地址
本文主要介紹regexp包下一些常用方法的使用方法總結
一、基礎知識
判斷在 b 中能否找到正則表示式 pattern 所匹配的子串
pattern:要查詢的正則表示式
matched:返回是否找到匹配項
err:返回查詢過程中遇到的任何錯誤
此函式通過呼叫 Regexp 的方法實現
//b:要在其中進行查詢的 []byte func Match(pattern string, b []byte) (matched bool, err error) func main() { fmt.Println(regexp.Match("H.* ", []byte("Hello World!"))) // true } // r:要在其中進行查詢的 RuneReader 介面 func MatchReader(pattern string, r io.RuneReader) (matched bool, err error) func main() { r := bytes.NewReader([]byte("Hello World!")) fmt.Println(regexp.MatchReader("H.* ", r)) // true } //s:要在其中進行查詢的字串 func MatchString(pattern string, s string) (matched bool, err error) func main() { fmt.Println(regexp.Match("H.* ", "Hello World!")) // true }
數字、漢字、拼音的匹配**
func Validate(str string) int { reg1 := regexp.MustCompile(`[0-9]+`) //正則匹配數字,匹配到數字函式返回1 reg2 := regexp.MustCompile(`[\p{Han}]+`)//正則匹配漢字,匹配到漢字函式返回2 reg3 := regexp.MustCompile(`[a-z]+`)//正則匹配拼音,匹配到拼音函式返回3 if reg1.MatchString(str) { return 1 } if reg2.MatchString(str) { return 2 } if reg3.MatchString(str) { return 3 } return -1 }
通過find查找出結果
//傳入[]byte,返回[]byte
func findTest() {
str := "ab001234hah120210a880218end"
reg := regexp.MustCompile("\\d{6}") //六位連續的數字
fmt.Println("------Find------")
//返回str中第一個匹配reg的字串
data := reg.Find([]byte(str))
fmt.Println(string(data))
fmt.Println("------FindAll------")
//返回str中所有匹配reg的字串
//第二個引數表示最多返回的個數,傳-1表示返回所有結果
dataSlice := reg.FindAll([]byte(str), -1)
for _, v := range dataSlice {
fmt.Println(string(v))
}
}
//傳入[]byte,返回首末位置索引
func findIndexTest() {
fmt.Println("------FindIndex------")
//返回第一個匹配的字串的首末位置
reg2 := regexp.MustCompile("start\\d*end") //start開始,end結束,中間全是數字
str2 := "00start123endhahastart120PSend09start10000end"
//index[0]表示開始位置,index[1]表示結束位置
index := reg2.FindIndex([]byte(str2))
fmt.Println("start:", index[0], ",end:", index[1], str2[index[0]:index[1]])
fmt.Println("------FindAllIndex------")
//返回所有匹配的字串首末位置
indexSlice := reg2.FindAllIndex([]byte(str2), -1)
for _, v := range indexSlice {
fmt.Println("start:", v[0], ",end:", v[1], str2[v[0]:v[1]])
}
}
//傳入string,返回string(更加方便)
func findStringTest() {
fmt.Println("------FindString------")
str := "ab001234hah120210a880218end"
reg := regexp.MustCompile("\\d{6}") //六位連續的數字
fmt.Println(reg.FindString(str))
fmt.Println(reg.FindAllString(str, -1))
//以下兩個方法是類似的
fmt.Println(reg.FindStringIndex(str))
fmt.Println(reg.FindIndex([]byte(str)))
}
//查詢漢字
func findChinesString() {
str := "hello中國hello世界和平hi好"
reg := regexp.MustCompile("[\\p{Han}]+")
fmt.Println(reg.FindAllString(str, -1))
//[中國 世界和平 好]
}
//查詢數字或小寫字母
func findNumOrLowerLetter() {
str := "HAHA00azBAPabc09FGabHY99"
reg := regexp.MustCompile("[\\d|a-z]+")
fmt.Println(reg.FindAllString(str, -1))
//[00az abc09 ab 99]
}
//查詢並替換
func findAndReplace() {
str := "Welcome for Beijing-Tianjin CRH train."
reg := regexp.MustCompile(" ")
fmt.Println(reg.ReplaceAllString(str, "@")) //將空格替換為@字元
//[email protected]@[email protected]@train.
}
二、常用匹配
text := `Hello 世界!123 Go.`
reg := regexp.MustCompile(`[a-z]+`) // 查詢連續的小寫字母
fmt.Printf("%q\n", reg.FindAllString(text, -1) // 輸出結果["ello" "o"]
reg = regexp.MustCompile(`[^a-z]+`) // 查詢連續的非小寫字母
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["H" " 世界!123 G" "."]
reg = regexp.MustCompile(`[\w]+`) // 查詢連續的單詞字母
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "123" "Go"]
reg = regexp.MustCompile(`[^\w\s]+`) // 查詢連續的非單詞字母、非空白字元
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界!" "."]
reg = regexp.MustCompile(`[[:upper:]]+`) // 查詢連續的大寫字母
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["H" "G"]
reg = regexp.MustCompile(`[[:^ascii:]]+`) // 查詢連續的非 ASCII 字元
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界!"]
reg = regexp.MustCompile(`[\pP]+`) // 查詢連續的標點符號
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["!" "."]
reg = regexp.MustCompile(`[\PP]+`) // 查詢連續的非標點符號字元
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界" "123 Go"]
reg = regexp.MustCompile(`[\p{Han}]+`) // 查詢連續的漢字
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["世界"]
reg = regexp.MustCompile(`[\P{Han}]+`) // 查詢連續的非漢字字元
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello " "!123 Go."]
reg = regexp.MustCompile(`Hello|Go`) // 查詢 Hello 或 Go
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"]
reg = regexp.MustCompile(`^H.*\s`) // 查詢行首以 H 開頭,以空格結尾的字串
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界!123 "]
reg = regexp.MustCompile(`(?U)^H.*\s`) // 查詢行首以 H 開頭,以空白結尾的字串(非貪婪模式)
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello "]
reg = regexp.MustCompile(`(?i:^hello).*Go`) // 查詢以 hello 開頭(忽略大小寫),以 Go 結尾的字串
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello 世界!123 Go"]
reg = regexp.MustCompile(`\QGo.\E`) // 查詢 Go.
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Go."]
reg = regexp.MustCompile(`(?U)^.* `) // 查詢從行首開始,以空格結尾的字串(非貪婪模式)
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello "]
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"]
reg = regexp.MustCompile(`[^ ]{1,4}o`) // 查詢連續 1 次到 4 次的非空格字元,並以 o 結尾的字串
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"]
reg = regexp.MustCompile(`(?:Hell|G)o`) // 查詢 Hello 或 Go
fmt.Printf("%q\n", reg.FindAllString(text, -1)) // ["Hello" "Go"]
reg = regexp.MustCompile(`(?PHell|G)o`) // 查詢 Hello 或 Go,替換為 Hellooo、Gooo
fmt.Printf("%q\n", reg.ReplaceAllString(text, "${n}ooo")) // "Hellooo 世界!123 Gooo."
reg = regexp.MustCompile(`(Hello)(.*)(Go)`) // 交換 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\\^$.*+?{}()[]|", "-"))
// "----------------------"
參考連結
持續更新中
如有不對歡迎指正,相互學習,共同進步。