正则表达式语法规则

正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活,按照它的语法规则,根据需求构造出的正则表达式能够从原始文本中筛选出几乎任何你想要得到的字符组合。

Go语言通过 regexp 包为正则表达式提供了官方支持,其采用 RE2 语法,除了\c、\C外,Go语言和 Perl、Python 等语言的正则基本一致。

正则表达式语法规则
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")构成的文字序列,可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

下面的表格中列举了构成正则表达式的一些语法规则及其含义。

  1. 字符

在这里插入图片描述

  1. 数量词(用在字符或 (…) 之后)
    在这里插入图片描述

  2. 边界匹配
    在这里插入图片描述

  3. 逻辑、分组

在这里插入图片描述

  1. 特殊构造(不作为分组)

在这里插入图片描述

Regexp 包的使用
下面通过几个示例来演示一下 regexp 包的使用。

【示例 1】匹配指定类型的字符串。

01.package main
02.
03.import (
04. “fmt”
05. “regexp”
06.)
07.
08.func main() {
09.
10. buf := “abc azc a7c aac 888 a9c tac”
11.
12. //解析正则表达式,如果成功返回解释器
13. reg1 := regexp.MustCompile(a.c)
14. if reg1 == nil {
15. fmt.Println(“regexp err”)
16. return
17. }
18.
19. //根据规则提取关键信息
20. result1 := reg1.FindAllStringSubmatch(buf, -1)
21. fmt.Println("result1 = ", result1)
22.}

运行结果如下:
result1 = [[abc] [azc] [a7c] [aac] [a9c]]  
【示例 2】匹配 a 和 c 中间包含一个数字的字符串。

01.package main
02.
03.import (
04. “fmt”
05. “regexp”
06.)
07.
08.func main() {
09.
10. buf := “abc azc a7c aac 888 a9c tac”
11.
12. //解析正则表达式,如果成功返回解释器
13. reg1 := regexp.MustCompile(a[0-9]c)
14.
15. if reg1 == nil { //解释失败,返回nil
16. fmt.Println(“regexp err”)
17. return
18. }
19.
20. //根据规则提取关键信息
21. result1 := reg1.FindAllStringSubmatch(buf, -1)
22. fmt.Println("result1 = ", result1)
23.}

运行结果如下:

result1 = [[a7c] [a9c]]
【示例 3】使用 \d 来匹配 a 和 c 中间包含一个数字的字符串。

01.package main
02.
03.import (
04. “fmt”
05. “regexp”
06.)
07.
08.func main() {
09.
10. buf := “abc azc a7c aac 888 a9c tac”
11.
12. //解析正则表达式,如果成功返回解释器
13. reg1 := regexp.MustCompile(a\dc)
14. if reg1 == nil { //解释失败,返回nil
15. fmt.Println(“regexp err”)
16. return
17. }
18.
19. //根据规则提取关键信息
20. result1 := reg1.FindAllStringSubmatch(buf, -1)
21. fmt.Println("result1 = ", result1)
22.}

运行结果如下:

result1 = [[a7c] [a9c]]
【示例 4】匹配字符串中的小数。

01.package main
02.
03.import (
04. “fmt”
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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的正则表达式语法规则如下: 1. 字符匹配: - 普通字符:匹配与之相等的字符,例如 'a' 匹配字符 'a'。 - 元字符:具有特殊含义的字符,例如使用反斜杠 '\' 可以转义元字符,使其变为普通字符。 - 字符集合:用方括号 [] 表示,匹配方括号中的任意一个字符,例如 [abc] 匹配字符 'a'、'b' 或 'c'。 - 反向字符集合:用方括号 [^] 表示,匹配除了方括号中的任意一个字符外的其他字符,例如 [^abc] 匹配除了字符 'a'、'b' 或 'c' 之外的任意一个字符。 2. 重复匹配: - *:匹配前一个字符零次或多次,例如 'a*' 匹配零个或多个 'a'。 - +:匹配前一个字符一次或多次,例如 'a+' 匹配至少一个 'a'。 - ?:匹配前一个字符零次或一次,例如 'a?' 匹配零个或一个 'a'。 - {n}:匹配前一个字符恰好 n 次,例如 'a{3}' 匹配恰好三个 'a'。 - {n,}:匹配前一个字符至少 n 次,例如 'a{3,}' 匹配至少三个 'a'。 - {n,m}:匹配前一个字符至少 n 次、最多 m 次,例如 'a{3,5}' 匹配三到五个 'a'。 3. 特殊字符: - \d:匹配任意一个数字字符,相当于 [0-9]。 - \D:匹配任意一个非数字字符,相当于 [^0-9]。 - \w:匹配任意一个字母、数字或下划线字符,相当于 [a-zA-Z0-9_]。 - \W:匹配任意一个非字母、非数字、非下划线字符,相当于 [^a-zA-Z0-9_]。 - \s:匹配任意一个空白字符,包括空格、制表符、换行符等。 - \S:匹配任意一个非空白字符。 - \b:匹配单词的边界,即单词与非单词字符之间的位置。 - \B:匹配非单词的边界。 4. 分组和捕获: - (pattern):定义一个分组,可以对分组内的内容进行捕获和后续引用。 - \number:引用第 number 个分组捕获的内容,例如 \1 引用第一个分组的内容。 5. 其他元字符: - ^:匹配字符串的开头。 - $:匹配字符串的结尾。 - |:匹配两个模式中的任意一个,相当于逻辑上的或操作。 这些是基本的正则表达式语法规则,还有更多高级的功能和语法可以用于更复杂的匹配需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值