1. 匹配:
import ("fmt""regexp"
)//查找整个字符串中所有连续的3个数字reg := regexp.MustCompile(`\d{3}`)match := reg.FindAllStringSubmatch("aaa111bbb222ccc333",-1)for i, v := range match {fmt.Println("i=",i,"v=",v)}
结果:
i= 0 v= [111]
i= 1 v= [222]
i= 2 v= [333]
有时候,需要查找的位置是相对固定的,方法大同小异:
//查找固定位置出现的3个数字reg := regexp.MustCompile(`aaa111bbb(\d{3})ccc(\d{3})`)match := reg.FindStringSubmatch("aaa111bbb222ccc333")fmt.Println(match[1]) fmt.Println(match[2])
结果:
222
333
总结:在一个字符串中,需要的内容重复次数不定,就用第一个例子的FindAllStringSubmatch函数。如果位置是相对确定的,就用FindStringSubmatch函数,在正则表达式中把需要抓取的内容用()小括号括起来就行了。
2. 替换
//例1: var s = "aaa111bbb222ccc333"reg := regexp.MustCompile(`\d{3}`)t := reg.ReplaceAllString(s,"###")fmt.Println(t)
结果:
aaa###bbb###ccc###//例2:var s = "aaa111bbb222ccc333"reg := regexp.MustCompile(`aaa111bbb(\d{3})ccc333`)t := reg.ReplaceAllString(s,"###${1}***")fmt.Println(t)
结果:
###222***
替换的基本逻辑是:将匹配到的结果,用指定的字符串替换,如例1中,将所有的连续3个数字的部分用#号替换了。不过有时候,我们并不总是想整体替换,这种情况下需要在指定位置将内容用()小括号括起来,然后用$1表示第1个匹配项,$2表示第2个以此类推。比如在例2中,数字222本身被保留,它前面的部分被###替代了,而它后面的部分则被 *** 替代。