Go xmas2020 学习笔记 13、Regular Expressions

课程地址 go-class-slides/xmas-2020 at trunk · matt4biz/go-class-slides (github.com)

主讲老师 Matt Holiday

image-20220401081031592

正则表达式参考资料

Syntax · google/re2 Wiki (github.com)

13-Regular Expressions

Simple string searches

image-20220411094554046

func main() {
	test := "Here is $1 which is $2!"
	test = strings.ReplaceAll(test, "$1", "honey")
	test = strings.ReplaceAll(test, "$2", "tasty")
	fmt.Println(test)
}
Here is honey which is tasty!

使用 \(strings\) 包进行简单搜索,对于复杂搜索和验证,谨慎使用 \(regexp\)


Location by regex

func main() {
	te := "aba abba abbba"
	re := regexp.MustCompile(`b+`)
	mm := re.FindAllString(te, -1)
	id := re.FindAllStringIndex(te, -1)

	fmt.Println(mm)
	fmt.Println(id)

	for _, d := range id {
		fmt.Println(te[d[0]:d[1]])
	}

	up := re.ReplaceAllStringFunc(te, strings.ToUpper)

	fmt.Println(up)
}

[b bb bbb]
[[1 2] [5 7] [10 13]]
b
bb
bbb
aBa aBBa aBBBa

FindAllString(te, -1) 返回匹配的字符串切片。

FindAllStringIndex(te, -1) 返回匹配的字符串位置,是切片的切片。


UUID validation

image-20220411105109285

image-20220411105124164

var uu = regexp.MustCompile(`^[[:xdigit:]]{8}-[[:xdigit:]]{4}-[1-5][[:xdigit:]]{3}-[89abAB][[:xdigit:]]{3}-[[:xdigit:]]{12}$`)

var test = []string{
	"072664ee-a034-4cc3-a2e8-9f1822c43bbb",
	"072664ee-a034-4cc3-a2e8-9f1822c43bbbb", // ^ 如果不加 ^ $ 匹配了前面的且忽略了后面的b
	"072664ee-a034-6cc3-a2e8-9f1822c43bbbb",
	"072664ee-a034-4cc3-C2e8-9f1822c43bbb",
}

func main() {
	for i, t := range test {
		if !uu.MatchString(t) {
			fmt.Println(i, t, "\tfails")
		}
	}
}
1 072664ee-a034-4cc3-a2e8-9f1822c43bbbb 	fails
2 072664ee-a034-6cc3-a2e8-9f1822c43bbbb 	fails
3 072664ee-a034-4cc3-C2e8-9f1822c43bbb 	fails

Capture groups

var ph = regexp.MustCompile(`\(([[:digit:]]{3})\) ([[:digit:]]{3})-([[:digit:]]{4})`)

func main() {
	orig := "(214) 514-9548"
	match := ph.FindStringSubmatch(orig)

	fmt.Printf("%q\n", match)

	if len(match) > 3 {
		fmt.Printf("+1 %s-%s-%s\n", match[1], match[2], match[3])
	}
}
["(214) 514-9548" "214" "514" "9548"]
+1 214-514-9548

image-20220411114347646


URL re

image-20220411115840243

(?::([0-9]+))? 末尾的问号确定圆括号内的内容可以出现零次或一次。
?: 表示不被捕获,即整个括号内容匹配了也不添加到返回的切片里。
但内部又有一个捕获组 ([0-9]+) 匹配出现一次或多次的数字,将被捕获到字符串放入返回的切片中。
所以 :([0-9]+) 这一整个不会出现在切片中,而 ([0-9]+) 会出现在切片中。

image-20220411120248457

image-20220411120852695

FindStringSubmatch 只会匹配最后一个,使用FindAllStringSubmatch返回全部匹配,切片的切片。

posted @ 2022-04-11 12:21  小能日记  阅读(11)  评论(0编辑  收藏  举报