正則表達(dá)式是一種進(jìn)行模式匹配和文本操縱的功能強(qiáng)大的工具。正則表達(dá)式靈活、易用,按照它的語法規(guī)則,隨需構(gòu)造出的匹配模式就能夠從原始文本中篩選出幾乎任何你想要得到的字符組合。
準(zhǔn)則
使用regexp調(diào)用
Match,MatchReader和 MatchString
// 判斷b中是夠包含pattern能夠組成的任意字符串 func Match(pattern string, b []byte) (matched bool, err error) // 判斷reader r中返回的字符串是否包含pattern能夠組成的任意字符串 func MatchReader(pattern string, r io.RuneReader) (matched bool, err error) // 判斷字符串s中是否包含pattern能夠組成的任意字符串 func MatchString(pattern string, s string) (matched bool, err error)
Compile 和 MushCompile
func Compile(expr string) (*Regexp, error)
func MustCompile(str string) *Regexp
Compile :返回 Regexp 對象,方便調(diào)用指針函數(shù)。
MustCompile :同Compile,解析表達(dá)式失敗,會panic。
在匹配文本時(shí),該正則表達(dá)式會盡可能早的開始匹配,并且在匹配過程中選擇回溯搜索到的第一個匹配結(jié)果。這種模式被稱為 leftmost-first ,另外一般情況下使用 MustCompile 即可。
使用regexp.Regexp對象來調(diào)用
Find 和 FindAll
Find返回保管正則表達(dá)式re在b中的最左側(cè)的一個匹配結(jié)果的[]byte切片。如果沒有匹配到,會返回nil,最多匹配一個。
re := regexp.MustCompile(`foo.?`) fmt.Printf("%q\n", re.Find([]byte(`seafood fool`)))
re := regexp.MustCompile(`foo.?`) fmt.Printf("%q\n", re.FindAll([]byte(`seafood fool`), -1))
FindAll 功能與 Find 一樣,只是返回全部滿足條件的數(shù)據(jù)。
FindString 和 FindAllString
與 Find 和 FindAll 一樣,只是針對字符串string操作。
FindIndex 和 FindAllIndex
FindIndex , 返回 b 中滿足匹配字符串部分的起始位置,同樣是**“l(fā)eftmost-first”**原則,loc包含起止位置。如果沒有找到,直接返回 nil 。
FindAllIndex ,功能和 FindIndex 保持一致,只是匹配多個, n 決定了匹配的位置。
FindStringIndex 和 FindAllStringIndex
與 FindIndex 和 FindAllIndex 使用方式類似,只是針對的是字符串string。
FindStringSubmatch 和 FindAllStringSubmatch
FindStringSubmatch :采用左匹配原則,最多匹配一個,如果沒有的話,返回 nil 。對于返回的 []string ,分別標(biāo)示匹配的字符串,子串。
re := regexp.MustCompile(`a(x*)b(y|z)c`) fmt.Printf("%q\n", re.FindStringSubmatch("-axxxbyc-")) fmt.Printf("%q\n", re.FindStringSubmatch("-abzc-"))
輸出結(jié)果:
["axxxbyc" "xxx" "y"]
["abzc" "" "z"]
和 FindStringSubmatch 使用類似,只是能顧選擇匹配的長度, -1 表示匹配到末尾。
re := regexp.MustCompile(`a(x*)b`) fmt.Printf("%q\n", re.FindAllStringSubmatch("-ab-", -1)) fmt.Printf("%q\n", re.FindAllStringSubmatch("-axxb-", -1)) fmt.Printf("%q\n", re.FindAllStringSubmatch("-ab-axb-", -1)) fmt.Printf("%q\n", re.FindAllStringSubmatch("-axxb-ab-", -1))
輸出結(jié)果:
[["ab" ""]]
[["axxb" "xx"]]
[["ab" ""] ["axb" "x"]]
[["axxb" "xx"] ["ab" ""]]
FindSubmatchIndex 和 FindAllSubmatchIndex
另外, index 返回為 左閉右開 的模式,示例中的 2,2 表示空字符串的意思。 并且,不會存在重合匹配的,比如說"-axxb-ab-"去匹配 a(x*)b ,不會存在第一個 a 和最后一個 b 結(jié)合的情況,如果使用 Longest 就會匹配最長的。
re := regexp.MustCompile(`a(x*)b`) // Indices: // 01234567 012345678 // -ab-axb- -axxb-ab- fmt.Println(re.FindAllStringSubmatchIndex("-ab-", -1)) fmt.Println(re.FindAllStringSubmatchIndex("-axxb-", -1)) fmt.Println(re.FindAllStringSubmatchIndex("-ab-axb-", -1)) fmt.Println(re.FindAllStringSubmatchIndex("-axxb-ab-", -1)) fmt.Println(re.FindAllStringSubmatchIndex("-foo-", -1))
輸出結(jié)果:
[[1 3 2 2]] // 2 2 表示為空
[[1 5 2 4]]
[[1 3 2 2] [4 7 5 6]]
[[1 5 2 4] [6 8 7 7]]
[]
FindStringSubmatchIndex 和 FindAllStringSubmatchIndex func (re *Regexp) FindStringSubmatchIndex(s string) []int func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int 和 FindSubmatchIndex , FindAllSubmatchIndex 保持一致。 Longest func (re *Regexp) Longest() 獲取最長匹配的滿足條件的內(nèi)容。 re := regexp.MustCompile(`a(|b)`) fmt.Println(re.FindString("ab")) re.Longest() fmt.Println(re.FindString("ab"))
輸出結(jié)果:
a
ab
下面這種情況不會最長匹配。
re := regexp.MustCompile(`a(x*)b`) re.Longest() fmt.Println(re.FindString("-axxb-ab-")) // axxb,不會存在第一個a和最后一個b組合的過程。
Match,MatchString和MatchReader
判斷 b , s 和 r 返回的數(shù)據(jù)是否滿足正則表達(dá)式,返回 true 或者 false 。
NumSubexp
返回分組的數(shù)量。
re0 := regexp.MustCompile(`a.`) fmt.Printf("%d\n", re0.NumSubexp()) re := regexp.MustCompile(`(.*)((a)b)(.*)a`) fmt.Println(re.NumSubexp())
輸出結(jié)果:
0
4
ReplaceAll 和 ReplaceAllString func (re *Regexp) ReplaceAll(src, repl []byte) []byte func (re *Regexp) ReplaceAllString(src, repl string) string ReplaceAllString 與 ReplaceAll 使用方式相同。 re := regexp.MustCompile(`a(x*)b`) fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("T"))) fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("$1"))) // $1表示匹配的第一個子串,這是ab的中間無字符串,所以$1為空,然后使用空去替換滿足正則表達(dá)式的部分。 fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("$1W"))) // "$1W"等價(jià)與"$(1W)",值為空,將滿足條件的部分完全替換為空。 fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("${1}W"))) // ${1}匹配(x*),保留。輸出-W-xxW-
輸出結(jié)果:
-T-T-
--xx-
---
-W-xxW-
s := "Hello World, 123 Go!" //定義一個正則表達(dá)式reg,匹配Hello或者Go reg := regexp.MustCompile(`(Hell|G)o`) s2 := "2019-12-01,test" //定義一個正則表達(dá)式reg2,匹配 YYYY-MM-DD 的日期格式 reg2 := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`) //最簡單的情況,用“T替換”"-ab-axxb-"中符合正則"a(x*)b"的部分 reg3 := regexp.MustCompile("a(x*)b") fmt.Println(re.ReplaceAllString("-ab-axxb-", "T")) // -T-T- //${1}匹配"Hello World, 123 Go!"中符合正則`(Hell|G)`的部分并保留,去掉"Hello"與"Go"中的'o'并用"ddd"追加 rep1 := "${1}ddd" fmt.Printf("%q\n", reg.ReplaceAllString(s, rep1)) // Hellddd World, 123 Gddd! //首先,"2019-12-01,test"中符合正則表達(dá)式`(\d{4})-(\d{2})-(\d{2})`的部分是"2019-12-01",將該部分匹配'(\d{4})'的'2019'保留,去掉剩余部分 rep2 := "${1}" fmt.Printf("%q\n", reg2.ReplaceAllString(s2,rep2)) // 2019,test //首先,"2019-12-01,test"中符合正則表達(dá)式`(\d{4})-(\d{2})-(\d{2})`的部分是"2019-12-01",將該部分匹配'(\d{2})'的'12'保留,去掉剩余部分 rep3 := "${2}" fmt.Printf("%q\n", reg2.ReplaceAllString(s2,rep3)) // 12,test //首先,"2019-12-01,test"中符合正則表達(dá)式`(\d{4})-(\d{2})-(\d{2})`的部分是"2019-12-01",將該部分匹配'(\d{2})'的'01'保留,去掉剩余部分,并追加"13:30:12" rep4 := "${3}:13:30:12" fmt.Printf("%q\n", reg2.ReplaceAllString(s2,rep4)) // 01:13:30:12,test }
ReplaceAllFunc 和 ReplaceAllStringFunc
將匹配出來滿足條件的 []byte 作為參數(shù)傳入函數(shù)中。
re := regexp.MustCompile(`[^aeiou]`) fmt.Println(re.ReplaceAllStringFunc("seafood fool", strings.ToUpper))
兩者使用方式類似。
ReplaceAllLiteral 和 ReplaceAllLiteralString
匹配字面常量,不轉(zhuǎn)換。
re := regexp.MustCompile(`a(x*)b`) fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "T")) fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "$1")) fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "${1}"))
輸出結(jié)果:
-T-T-
-$1-$1-
-${1}-${1}-
關(guān)于 $1 說明:
Expand 和 ExpandString
Expand返回新生成的將template添加到dst后面的切片。在添加時(shí),Expand會將template中的變量替換為從src匹配的結(jié)果。match應(yīng)該是被FindSubmatchIndex返回的匹配結(jié)果起止位置索引。(通常就是匹配src,除非你要將匹配得到的位置用于另一個[]byte)
在template參數(shù)里,一個變量表示為格式如: $name 或 ${name} 的字符串,其中name是長度>0的字母、數(shù)字和下劃線的序列。一個單純的數(shù)字字符名如$1會作為捕獲分組的數(shù)字索引;其他的名字對應(yīng)(?P...)語法產(chǎn)生的命名捕獲分組的名字。超出范圍的數(shù)字索引、索引對應(yīng)的分組未匹配到文本、正則表達(dá)式中未出現(xiàn)的分組名,都會被替換為空切片。
$name格式的變量名,name會盡可能取最長序列: $1x 等價(jià)于 ${1x} 而非 ${1}x , $10 等價(jià)于 ${10} 而非 ${1}0 。因此 $name 適用在后跟空格/換行等字符的情況, ${name} 適用所有情況。
如果要在輸出中插入一個字面值 '$' ,在template里可以使用 $$ 。
其他示例
解析網(wǎng)址
flysnowRegexp := regexp.MustCompile(`^http://www.flysnow.org/([\d]{4})/([\d]{2})/([\d]{2})/([\w-]+).html$`) params := flysnowRegexp.FindStringSubmatch("http://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html") // 返回[]string{}數(shù)據(jù)類型 for _, param := range params { fmt.Println(param) }
輸出結(jié)果:
http://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html
2018
01
20
golang-goquery-examples-selector
總結(jié)
到此這篇關(guān)于Go語言正則表達(dá)式的使用詳解的文章就介紹到這了,更多相關(guān)Go正則表達(dá)式使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:貴陽 廣西 慶陽 調(diào)研邀請 西雙版納 太原 德州 阿克蘇
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go語言正則表達(dá)式的使用詳解》,本文關(guān)鍵詞 語言,正則,表達(dá)式,的,使用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。