本系列教程的代碼已上傳至github: https://github.com/xinxing0913/xinxing-golang-useful ,另外我的微信:xinxing0913。如果您感覺有用,不妨收藏或者關(guān)注一下,如果能分享一下那就最好了。
正則表達(dá)式在各個(gè)語言中都算是比較常用的了,一般我們的正則表達(dá)式主要用于三個(gè)地方:
- 正則匹配。判斷某個(gè)字符串是否符合規(guī)則,比如用來驗(yàn)證郵箱格式是否合法,比如驗(yàn)證手機(jī)號(hào)是否合法。
- 正則提取。從一段文本中提取我們想要的內(nèi)容,比如我們從一段html文本中提取出所有的圖片地址,比如我們提取所有的文本內(nèi)容。
- 正則替換。它是找出某一段內(nèi)容進(jìn)行替換,比如我們可以把符合某個(gè)規(guī)則的都替換成一段固定的描述,我們可以把手機(jī)號(hào)的第5到第8位替換為星號(hào)來進(jìn)行手機(jī)號(hào)的脫敏。
我們還是通過三個(gè)實(shí)例來說明吧,首先是正則匹配。我們可以用regexp.MatchString()來判斷字符串是否和正則表達(dá)式匹配。我們也可以先用regexp.Compile()來編譯得到一個(gè)正則表達(dá)式的對(duì)象,這樣就可以進(jìn)行復(fù)用了。
我們還是來看一個(gè)范例吧,如下所示:
package main
import (
"fmt"
"regexp"
)
func main() {
// 直接驗(yàn)證某個(gè)字符串是否符合某個(gè)模式
match, _ := regexp.MatchString("1[0-9]{10}", "15722223333")
fmt.Println("匹配結(jié)果是:", match)
// 首先進(jìn)行編譯
r, _ := regexp.Compile("x[a-z]?")
// 然后判斷是否匹配xinxing
match1 := r.MatchString("xinxing")
fmt.Println("是否匹配xinxing:", match1)
// 然后判斷是否匹配java
match2 := r.MatchString("java")
fmt.Println("是否匹配java:", match2)
}
它首先判斷一個(gè)酷似手機(jī)號(hào)的數(shù)字是否和指定的正則表達(dá)式相匹配,然后它編譯了一個(gè)正則表達(dá)式,然后分別判斷了兩個(gè)字符串,我們來看一下執(zhí)行結(jié)果吧:
匹配結(jié)果是: true
是否匹配xinxing: true
是否匹配java: false
然后是正則提取,我們可以用一個(gè)正則表達(dá)式的對(duì)象的FindAllString()方法來提取我們想要的格式,它還可以限制提取的次數(shù),一般我們可以用-1表示不限制次數(shù)。
我們還是來看一個(gè)范例吧,如下所示:
package main
import (
"fmt"
"regexp"
)
func main() {
// 首先編譯一個(gè)正則表達(dá)式
r, _ := regexp.Compile("[0-9]+")
// 定義字符串
str := "在2008年的時(shí)候,我8歲了,身高75厘米,上2年級(jí)"
// 不限制提取次數(shù)
arr1 := r.FindAllString(str, -1)
fmt.Println("總的提取的數(shù)據(jù):", arr1)
fmt.Println("提取的第二個(gè)數(shù)據(jù):", arr1[1])
// 最多提取兩次
arr2 := r.FindAllString(str, 2)
fmt.Println("總的提取的數(shù)據(jù):", arr2)
fmt.Println("提取的第二個(gè)數(shù)據(jù):", arr2[1])
}
然后是執(zhí)行結(jié)果:
總的提取的數(shù)據(jù): [2008 8 75 2]
提取的第二個(gè)數(shù)據(jù): 8
總的提取的數(shù)據(jù): [2008 8]
提取的第二個(gè)數(shù)據(jù): 8
還有一個(gè)常見的功能即正則替換,我們可以用ReplaceAllString()來替換所有的字符串,第一個(gè)參數(shù)是原始內(nèi)容,第二個(gè)是要被替換后的內(nèi)容。
來看一個(gè)范例吧:
package main
import (
"fmt"
"regexp"
)
func main() {
// 定義字符串
str := "我今年22歲,學(xué)習(xí)java3年了,學(xué)習(xí)go2年了"
// 定義正則表達(dá)式
r, _ := regexp.Compile("[0-9]+")
// 替換后的結(jié)果
result := r.ReplaceAllString(str, "--保密--")
fmt.Println("原始內(nèi)容: ", str)
fmt.Println("后來內(nèi)容: ", result)
}
在上述代碼中,我們把所有的數(shù)字都替換成了"--保密--"這個(gè)樣式的字符串,下面是其執(zhí)行結(jié)果:
原始內(nèi)容: 我今年22歲,學(xué)習(xí)java3年了,學(xué)習(xí)go2年了
后來內(nèi)容: 我今年--保密--歲,學(xué)習(xí)java--保密--年了,學(xué)習(xí)go--保密--年了
對(duì)于go的正則表達(dá)式的部分,我們就介紹到這里啦,朋友們有問題的話可以在后面留言奧。