正则的使用场景还是很广的,使用的技巧也比较多, 在这里汇总一下。

举一个最简单的例子

有一个URL: http://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html, 现在我们需要提取里面的日期信息,还有文章的标题,该怎么办呢?

我们定义的正则表达式如下, 顺便来看看一些语法规则和含义:

  1. ^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包的使用

  1. 查看是否匹配字符串, ``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
  1. 2. 返回匹配的子串
  2. ```go
  3. // 返回匹配的子串
  4. fmt.Println(r.FindString("Hello World! world")) //Hello World!
  5. //同上
  6. fmt.Println(string(r.Find([]byte("Hello World!")))) //Hello World!
  1. 返回第一次索引的匹配,起始索引和结束索引,而不是匹配的字符串

    1. fmt.Println(r.FindStringIndex("Hello World! world")) //[0 12]
  2. 返回全局匹配的字符串和局部匹配的字符,匹配最大的子字符串一次

    1. //匹配`H(.*)d!`的字符串和匹配`(.*)`的字符串
    2. fmt.Println(r.FindStringSubmatch("Hello World! world"))
    3. //list[0] = "Hello World!"
    4. //list[1] = "ello Worl"
  3. 返回所有的正则匹配的字符,不仅仅是第一个 ```go fmt.Println(r.FindAllString(“Hello World! Held! world”, -1)) //[Hello World! Held!]

  1. 6. 提供一个数量词来限制匹配数量
  2. ```go
  3. res, _ := regexp.Compile("H([a-z]+)d!")
  4. fmt.Println(res.FindAllString("Hello World! Held! Hellowrld! world", 2)) //[Held! Hellowrld!]
  1. 只查找前 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

项目中的使用

参考:
Golang正则表达式
正则表达式语法规则