总览
如果不熟悉正则表达式的语法的话,可以执行下面命令:
go doc regexp/syntax
联系代码
package main
import (
"fmt"
"regexp"
)
func expandTest() {
pat := `(((abc.)def.)ghi)`
reg := regexp.MustCompile(pat)
fmt.Println(reg.NumSubexp())
src := []byte(`abc-def-ghi abc+def+ghi`)
template := []byte(`$0 $1 $2 $3`)
// 替换第一次匹配结果
match := reg.FindSubmatchIndex(src)
fmt.Printf("%v\n", match) // [0 11 0 11 0 8 0 4]
dst := reg.Expand(nil, template, src, match)
fmt.Printf("%s\n\n", dst)
// abc-def-ghi abc-def-ghi abc-def- abc-
// 替换所有匹配结果
for _, match := range reg.FindAllSubmatchIndex(src, -1) {
fmt.Printf("%v\n", match)
dst := reg.Expand(nil, template, src, match)
fmt.Printf("%s\n", dst)
}
// [0 11 0 11 0 8 0 4]
// abc-def-ghi abc-def-ghi abc-def- abc-
// [12 23 12 23 12 20 12 16]
// abc+def+ghi abc+def+ghi abc+def+ abc+
}
func testFind() {
re := regexp.MustCompile("a*r")
fmt.Println(string(re.Find([]byte("paranoabrmal"))))
fmt.Println(re.NumSubexp())
rep := regexp.MustCompilePOSIX("a*r|ara")
fmt.Println(string(rep.Find([]byte("paranoabrmal"))))
fmt.Println(rep.NumSubexp())
b := []byte("abc1def1")
pat := `abc1|abc1def1`
reg1 := regexp.MustCompile(pat) // 第一匹配
reg2 := regexp.MustCompilePOSIX(pat) // 最长匹配
fmt.Printf("%s\n", reg1.Find(b)) // abc1
fmt.Printf("%s\n", reg2.Find(b)) // abc1def1
fmt.Println(reg1.NumSubexp())
b = []byte("abc1def1"