Golang中的正则表达式

数据结构

1
type Regexp struct {}

方法

创建正则

1
2
func Compile(expr string) (*Regexp, error)     // 创建一个正则表达式,如果无法解析,则报错
func MustCompile(str string) *Regexp // 如果无法解析,则panic

比较函数

1
2
3
func Match(pattern string, b []byte) (matched bool, err error)                         匹配字节切片,返回是否存在
func MatchReader(pattern string, r io.RuneReader) (matched bool, err error) 匹配RuneReader,返回是否存在
func MatchString(pattern string, s string) (matched bool, err error) 匹配字符串,返回是否存在

方法函数

1
2
3
4
5
6
7
8
9
10
11
12
13
// 返回是否存在
func (re *Regexp) Match(b []byte) bool
func (re *Regexp) MatchReader(r io.RuneReader) bool
func (re *Regexp) MatchString(s string) bool
// 查询字符串或者字节切片、RuneReader、字符串,例如字符串
func (re *Regexp) FindAllString(s string, n int) []string
func (re *Regexp) FindAllStringIndex(s string, n int) [][]int
func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string
func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int
func (re *Regexp) FindString(s string) string
func (re *Regexp) FindStringIndex(s string) (loc []int)
func (re *Regexp) FindStringSubmatch(s string) []string
func (re *Regexp) FindStringSubmatchIndex(s string) []int

实际使用

正则表达式的实际使用重点在限定符、特殊字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 匹配a?z,?只能是0-9
r1 := regexp.MustCompile("a[0-9]z")
println(r1.MatchString("a0z"))

// 只能是012
regexp.MustCompile("a[^012]z")

// 匹配除了0-9之外的其他字符
regexp.MustCompile("a[^0-9]z")

// 除了\r \n 任何字符
regexp.MustCompile("a.z")

// 匹配空白字符\s是任何字符,包括\r \n,\S匹配非空白符。都不能匹配空,也就是az
regexp.MustCompile("a\\Sz")
regexp.MustCompile("a\\sz")

// 匹配数字字母下划线
regexp.MustCompile("a\\wz")

特殊字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 以abc结尾
regexp.MustCompile("abc$")

// 以abc开头
regexp.MustCompile("^abc")

// c至少出现一次
regexp.MustCompile("abc+")

// c出现0次或多次
regexp.MustCompile("abc*")

// c出现0次或多次
regexp.MustCompile("abc?")
// bc出现0次或多次
regexp.MustCompile("a(bc)?")

// bc至少出现1次
regexp.MustCompile("a(bc){1}")
// 一个或者两个c
regexp.MustCompile("abc{1,2}z")
// 至少一个bc
regexp.MustCompile("a(bc){1}")

// 匹配单词边界,匹配开头或者结尾
regexp.MustCompile("\\babc")
regexp.MustCompile("abc\\b")

// 非单词边界匹配,没有abc开头但是包含abc
regexp.MustCompile("\\Babc")
// 没有abc结尾但是包含abc
regexp.MustCompile("abc\\B")

贪婪模式

1
2
3
4
5
r1 := regexp.MustCompile("ab+c")
r1.FindString("abbbabcabbbbbc") // 寻找第一个匹配的字符串,并返回

regexp.MustCompile("ab.+c") // 返回尽可能匹配多的
regexp.MustCompile("ab.*c")

非贪婪模式

1
regexp.MustCompile("ab.*?c") // ?取一个即止

更多正则表达式用法:

表达式