正则的使用场景还是很广的,使用的技巧也比较多, 在这里汇总一下。
举一个最简单的例子
有一个URL: http://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html, 现在我们需要提取里面的日期信息,还有文章的标题,该怎么办呢?
我们定义的正则表达式如下, 顺便来看看一些语法规则和含义:
^http://www.flysnow.org/([\d]{4})/([\d]{2})/([\d]{2})/([\w-]+).html$
分类 | 语法 | 说明 | 表达式示例 | 匹配结果 |
---|---|---|---|---|
边界匹配 | ^ | 匹配字符串开头 | ^abc | abc |
$ | 匹配字符串末尾 | abc$ | abc | |
逻辑,分组
| (…) | 括起来的表达式将作为分组,分组将作为一个整体,可以后接数量词(可选项) | (abc){2} | abcabc | |
字符
| […] | 字符集(字符类),对应的位置可以是字符集中任意字符。
字符集中的字符可以逐个列出,也可以给出范围,如 [abc] 或 [a-c],
第一个字符如果是 ^ 则表示取反,如 [^abc] 表示除了abc之外的其他字符。后面也可以接量词,是可选项 | a[bcd]e | abe 或 ace 或 ade |
| | \d | 数字:[0-9] | a\dc | a1c |
| | \w | 单词字符:[A-Za-z0-9] | a\wc | abc |
| | . | 匹配任意除换行符”\n”外的字符 | a.c | abc |
| 数量词,用在字符或(…)之后 | * | 匹配前一个字符 0 或无限次 | abc* | ab 或 abccc |
| | + | 匹配前一个字符 1 次或无限次 | abc+ | abc 或 abccc |
| | ? | 匹配前一个字符 0 次或 1 次 | abc? | ab 或 abc |
| | {m} | 匹配前一个字符 m 次 | ab{2}c | abbc |
regexp包的使用
- 查看是否匹配字符串,
``go // .匹配任意一个字符 ,*匹配零个或多个 ,优先匹配更多(贪婪) match, _ := regexp.MatchString("H(.*)d!", "Hello World!") fmt.Println(match) //true //或 match, _ = regexp.Match("H(.*)d!", []byte("Hello World!")) fmt.Println(match) //true //或通过
Compile`来使用一个优化过的正则对象 r, _ := regexp.Compile(“H(.*)d!”) fmt.Println(r.MatchString(“Hello World!”)) //true
2. 返回匹配的子串
```go
// 返回匹配的子串
fmt.Println(r.FindString("Hello World! world")) //Hello World!
//同上
fmt.Println(string(r.Find([]byte("Hello World!")))) //Hello World!
返回第一次索引的匹配,起始索引和结束索引,而不是匹配的字符串
fmt.Println(r.FindStringIndex("Hello World! world")) //[0 12]
返回全局匹配的字符串和局部匹配的字符,匹配最大的子字符串一次
//匹配`H(.*)d!`的字符串和匹配`(.*)`的字符串
fmt.Println(r.FindStringSubmatch("Hello World! world"))
//list[0] = "Hello World!"
//list[1] = "ello Worl"
返回所有的正则匹配的字符,不仅仅是第一个 ```go fmt.Println(r.FindAllString(“Hello World! Held! world”, -1)) //[Hello World! Held!]
6. 提供一个数量词来限制匹配数量
```go
res, _ := regexp.Compile("H([a-z]+)d!")
fmt.Println(res.FindAllString("Hello World! Held! Hellowrld! world", 2)) //[Held! Hellowrld!]
- 只查找前 n 个匹配项,如果 n < 0,则查找所有匹配项
``go reg = regexp.MustCompile(
(\w)(\w)+`) fmt.Println(reg.FindAllStringSubmatch(“Hello World!”, -1)) //[[Hello H o] [World W d]]
Compile和MustCompile的区别
没有多大区别,最主要就是MustCompile返回来一个err