正则表达式是进行模式匹配和文本操作的复杂而强大的工具。 正则表达式比纯文本匹配效率更低,但更灵活,根据语法规则,根据需要创建的正则表达式可以从原始文本中筛选几乎所有字符组合。
Go语言通过regexp包正式支持正则表达式,并采用RE2语法。 除c、c外,Go语言与Perl、Python等语言的正则表达式基本匹配。
正则表达式语法规则
正则表达式是常规字符(如字符a到z )和称为特殊字符“元字符”的字符串,可以是单个字符、字符集合、字符范围、字符之间的选择,也可以是所有这些组件的任意组合。
下表列出了构成正则表达式的语法规则及其含义。
文字
数量词(在文字或)…之后使用) )
边界一致
逻辑,分组
特殊结构(不分组)。
使用Regexp软件包
一些示例演示了regexp包的使用。
【例1】与指定类型的字符串一致。
01 .包主
02.
03 .导入(
04 .“调频”
05. “regexp”
06.)
07.
08.func main ()。
09.
10.buf :=" abca zca7CAAC 888 a9 ctac "
11.
12 .分析//正则表达式并成功返回解释器时
13.reg 1:=regexp.must compile (a.c ) )。
14. if reg1==nil {
15.FMT.println(「regexperr”)
16 .返回
17 ) }
18.
19. //根据规则提取重要信息
20.result 1:=reg1. findallstringsubmatch (buf,-1) )。
21.FMT.println('result1=',result1) )。
22.}
执行结果如下。
result1=[ ABC ] [ azc ] [ a7c ] [ AAC ] [ a9c ] ]
【例2】使a和c之间包含数字的字符串一致。
01 .包主
02.
03 .导入(
04 .“调频”
05. “regexp”
06.)
07.
08.func main ()。
09.
10.buf :=" abca zca7CAAC 888 a9 ctac "
11.
12 .分析//正则表达式并成功返回解释器时
13.reg 1:=regexp.must compile (a [0-9] c ) )。
14.
15. if reg1==nil { //解释失败,返回nil
16.FMT.println(「regexperr”)
17 .返回
18 ) }
19.
20. //根据规则提取重要信息
21.result 1:=reg1. findallstringsubmatch (buf,-1) )。
22.FMT.println('result1=',result1) )。
23.}
执行结果如下。
result1=[[a7c] [a9c]]
【例3】使用d使a和c之间包含数字的字符串匹配。
01 .包主
02.
03 .导入(
04 .“调频”
05. “regexp”
06.)
07.
08.func main ()。
09.
10.buf :=" abca zca7CAAC 888 a9 ctac "
11.
12 .分析//正则表达式并成功返回解释器时
13.reg 1:=regexp.must compile (a (DC ) )。
14. if reg1==nil { //解释失败,返回nil
15.FMT.println(「regexperr”)
16 .返回
17 ) }
18.
19. //根据规则提取重要信息
20.result 1:=reg1. findallstringsubmatch (buf,-1) )。
21.FMT.println('result1=',result1) )。
22.}
执行结果如下。
result1=[[a7c] [a9c]]
【例4】与字符串内的小数一致。
01 .包主
02.
03 .导入(
04 .“调频”
05. “regexp”
06.)
07.
08
.func main() {09. buf := "43.14 567 agsdg 1.23 7. 8.9 1sdljgl 6.66 7.8 "
10.
11. //解释正则表达式
12. reg := regexp.MustCompile(d+.d+)
13. if reg == nil {
14. fmt.Println(“MustCompile err”)
15. return
16. }
17.
18. //提取关键信息
19. //result := reg.FindAllString(buf, -1)
20. result := reg.FindAllStringSubmatch(buf, -1)
21. fmt.Println("result = ", result)
22.}
运行结果如下:
result = [[43.14] [1.23] [8.9] [6.66] [7.8]]
【示例 5】匹配 div 标签中的内容。
01.package main
02.
03.import (
04. “fmt”
05. “regexp”
06.)
07.
08.func main() {
09. // 原生字符串
10. buf := 11. 12.<!DOCTYPE html> 13.<html lang="zh-CN"> 14.<head> 15. <title>C语言中文网 | Go语言入门教程</title> 16.</head> 17.<body> 18. <div>Go语言简介</div> 19. <div>Go语言基本语法 20. Go语言变量的声明 21. Go语言教程简明版 22. </div> 23. <div>Go语言容器</div> 24. <div>Go语言函数</div> 25.</body> 26.</html> 27.
28.
29. //解释正则表达式
30. reg := regexp.MustCompile(<div>(?s:(.*?))</div>)
31. if reg == nil {
32. fmt.Println(“MustCompile err”)
33. return
34. }
35.
36. //提取关键信息
37. result := reg.FindAllStringSubmatch(buf, -1)
38.
39. //过滤<></>
40. for _, text := range result {
41. fmt.Println("text[1] = ", text[1])
42. }
43.}
运行结果如下:
text[1] = Go语言简介
text[1] = Go语言基本语法
Go语言变量的声明
Go语言教程简明版
text[1] = Go语言容器
text[1] = Go语言函数
【示例 6】通过 Compile 方法返回一个 Regexp 对象,实现匹配,查找,替换相关的功能。
01.package main
02.import (
03. “fmt”
04. “regexp”
05. “strconv”
06.)
07.func main() {
08. //目标字符串
09. searchIn := “John: 2578.34 William: 4567.23 Steve: 5632.18”
10. pat := “[0-9]+.[0-9]+” //正则
11.
12. f := func(s string) string{
13. v, _ := strconv.ParseFloat(s, 32)
14. return strconv.FormatFloat(v * 2, ‘f’, 2, 32)
15. }
16. if ok, _ := regexp.Match(pat, []byte(searchIn)); ok {
17. fmt.Println(“Match Found!”)
18. }
19. re, _ := regexp.Compile(pat)
20. //将匹配到的部分替换为 “##.#”
21. str := re.ReplaceAllString(searchIn, “##.#”)
22. fmt.Println(str)
23. //参数为函数时
24. str2 := re.ReplaceAllStringFunc(searchIn, f)
25. fmt.Println(str2)
26.}
输出结果:
Match Found!
John: ##.# William: ##.# Steve: ##.#
John: 5156.68 William: 9134.46 Steve: 11264.36
上面代码中 Compile 方法可以解析并返回一个正则表达式,如果成功返回,则说明该正则表达式正确可用于匹配文本。
另外我们也可以使用 MustCompile 方法,它也可以像 Compile 方法一样检验正则的有效性,但是当正则不合法时程序将 panic。