func main() {
TestRegx()
}
func TestRegx() {
content := "helloabbyab"
pattern := "ab+"
//判断是否存在。一般没有什么太大价值。
match, err := regexp.MatchString(pattern, content)
if err != nil {
fmt.Println(err)
}
fmt.Println(match) //true
//Compile解析并返回一个正则表达式。如果成功返回,该Regexp就可用于匹配文本。
regex, err := regexp.Compile(pattern) //这里要传递正则表式
if err != nil {
fmt.Println(err)
}
fmt.Println(regex)
res := regex.FindAllString(content, -1) //第一个参数是匹配的文本。第二个参数是匹配次数,负数代表匹配所有。
fmt.Println(res) //[abb ab]
//+:匹配前面的子表达式一次或多次
//?:匹配前面的子表达式零次或一次.代表非贪婪模式。越少越好(优先跳出重复)
pattern = "ab+?"
regex, _ = regexp.Compile(pattern)
res = regex.FindAllString(content, -1)
fmt.Println(res) // [ab ab]
//如果要匹配abbyab呢?
//.:匹配除 "\n" 之外的任何单个字符
//*:匹配前面的子表达式零次或多次。*和+都是贪婪模式,取得越多越好。
pattern = "a.*b"
regex, _ = regexp.Compile(pattern)
res = regex.FindAllString(content, -1)
fmt.Println(res) // [abbyab]
pattern = "a.+?b" //.+代表a后面至少要匹配一个任意字符(非"\n"),加上?代表非贪婪模式,点到为止。所以不会取到abbyab
regex, _ = regexp.Compile(pattern)
res = regex.FindAllString(content, -1)
fmt.Println(res) // [abb]
content = `
'FORMAT' => 'PNG',
'FORMAT' => 'JPG',
'IP' => 127.8.2.1,
`
pattern = "'FORMAT'.*=>(.*),"
regex, _ = regexp.Compile(pattern)
//用括号包起想要匹配的值。只会返回符合条件的第一个值.匹配不到返回空切片[]
res = regex.FindStringSubmatch(content)
fmt.Println(res) //FORMAT' => 'PNG', 'PNG']
if len(res) > 1 {
fmt.Println("匹配到的结果是:", res[1]) //匹配到的结果是: 'PNG'
}
//返回匹配的所有值
resAll := regex.FindAllStringSubmatch(content, -1)
fmt.Println(resAll) //[['FORMAT' => 'PNG', 'PNG'] ['FORMAT' => 'JPG', 'JPG']]
//怎么替换呢?比如把匹配到的PNG改为PDF
new := regex.ReplaceAllLiteralString(content, "PDF") //这个会将 'FORMAT' => 'PNG',一整个替换成PDF。
fmt.Println(new)
new = regex.ReplaceAllString(content, "PDF") //这个也会将 'FORMAT' => 'PNG', 一整个替换成PDF。
fmt.Println(new)
//这个依旧会将 'FORMAT' => 'PNG', 一整个替换成PDF。
new = regex.ReplaceAllStringFunc(content, func(rel string) string {
return "PDF"
})
fmt.Println(new)
//上面三个表达式都是输出:
// PDF
// PDF
// 'IP' => 127.8.2.1,
//但是我只想要变成FORMAT' => 'PDF',即只要替换子匹配的值,将PNG改为PDF.
}
go正则表达式
最新推荐文章于 2022-07-22 08:37:54 发布