1. 匹配:
import (
"fmt"
"regexp"
)
//查找整個(gè)字符串中所有連續(xù)的3個(gè)數(shù)字
reg := regexp.MustCompile(`\d{3}`)
match := reg.FindAllStringSubmatch("aaa111bbb222ccc333",-1)
for i, v := range match {
fmt.Println("i=",i,"v=",v)
}
結(jié)果:
i= 0 v= [111]
i= 1 v= [222]
i= 2 v= [333]
有時(shí)候票堵,需要查找的位置是相對(duì)固定的霸旗,方法大同小異:
//查找固定位置出現(xiàn)的3個(gè)數(shù)字
reg := regexp.MustCompile(`aaa111bbb(\d{3})ccc(\d{3})`)
match := reg.FindStringSubmatch("aaa111bbb222ccc333")
fmt.Println(match[1])
fmt.Println(match[2])
結(jié)果:
222
333
總結(jié):在一個(gè)字符串中颂跨,需要的內(nèi)容重復(fù)次數(shù)不定似炎,就用第一個(gè)例子的FindAllStringSubmatch函數(shù)。如果位置是相對(duì)確定的遇骑,就用FindStringSubmatch函數(shù)卖毁,在正則表達(dá)式中把需要抓取的內(nèi)容用()小括號(hào)括起來就行了。
2. 替換
//例1:
var s = "aaa111bbb222ccc333"
reg := regexp.MustCompile(`\d{3}`)
t := reg.ReplaceAllString(s,"###")
fmt.Println(t)
結(jié)果:
aaa###bbb###ccc###
//例2:
var s = "aaa111bbb222ccc333"
reg := regexp.MustCompile(`aaa111bbb(\d{3})ccc333`)
t := reg.ReplaceAllString(s,"###${1}***")
fmt.Println(t)
結(jié)果:
###222***
替換的基本邏輯是:將匹配到的結(jié)果质蕉,用指定的字符串替換,如例1中翩肌,將所有的連續(xù)3個(gè)數(shù)字的部分用#號(hào)替換了模暗。不過有時(shí)候,我們并不總是想整體替換念祭,這種情況下需要在指定位置將內(nèi)容用()小括號(hào)括起來兑宇,然后用$1表示第1個(gè)匹配項(xiàng),$2表示第2個(gè)以此類推粱坤。比如在例2中隶糕,數(shù)字222本身被保留,它前面的部分被###替代了站玄,而它后面的部分則被 *** 替代枚驻。