1) 字符

    语法 说明 表达式示例 匹配结果
    一般字符 匹配自身 abc abc
    . 匹配任意除换行符”\n”外的字符, 在 DOTALL 模式中也能匹配换行符 a.c abc
    \ 转义字符,使后一个字符改变原来的意思;
    如果字符串中有字符 需要匹配,可以使用 \ 或者字符集[*]。
    a\.c
    a\\c
    a.c
    a\c
    […] 字符集(字符类),对应的位置可以是字符集中任意字符。
    字符集中的字符可以逐个列出,也可以给出范围,如 [abc] 或 [a-c],
    第一个字符如果是 ^ 则表示取反,如 [^abc] 表示除了abc之外的其他字符。
    a[bcd]e abe 或 ace 或 ade
    \d 数字:[0-9] a\dc a1c
    \D 非数字:[^\d] a\Dc abc
    \s 空白字符:[<空格>\t\r\n\f\v] a\sc a c
    \S 非空白字符:[^\s] a\Sc abc
    \w 单词字符:[A-Za-z0-9] a\wc abc
    \W 非单词字符:[^\w] a\Wc a c

    2) 数量词(用在字符或 (…) 之后)

    语法 说明 表达式示例 匹配结果
    * 匹配前一个字符 0 或无限次 abc* ab 或 abccc
    + 匹配前一个字符 1 次或无限次 abc+ abc 或 abccc
    ? 匹配前一个字符 0 次或 1 次 abc? ab 或 abc
    {m} 匹配前一个字符 m 次 ab{2}c abbc
    {m,n} 匹配前一个字符 m 至 n 次,m 和 n 可以省略,若省略 m,则匹配 0 至 n 次;
    若省略 n,则匹配 m 至无限次
    ab{1,2}c abc 或 abbc

    3) 边界匹配

    语法 说明 表达式示例 匹配结果
    ^ 匹配字符串开头,在多行模式中匹配每一行的开头 ^abc abc
    $ 匹配字符串末尾,在多行模式中匹配每一行的末尾 abc$ abc
    \A 仅匹配字符串开头 \Aabc abc
    \Z 仅匹配字符串末尾 abc\Z abc
    \b 匹配 \w 和 \W 之间 a\b!bc a!bc
    \B [^\b] a\Bbc abc

    4) 逻辑、分组

    语法 说明 表达式示例 匹配结果
    | | 代表左右表达式任意匹配一个,优先匹配左边的表达式 abc|def abc 或 def
    (…) 括起来的表达式将作为分组,分组将作为一个整体,可以后接数量词 (abc){2} abcabc
    (?P…) 分组,功能与 (…) 相同,但会指定一个额外的别名 (?Pabc){2} abcabc
    \ 引用编号为 的分组匹配到的字符串 (\d)abc\1 1abe1 或 5abc5
    (?P=name) 引用别名为 的分组匹配到的字符串 (?P\d)abc(?P=id) 1abe1 或 5abc5

    5) 特殊构造(不作为分组)

    语法 说明 表达式示例 匹配结果
    (?:…) (…) 的不分组版本,用于使用 “|” 或后接数量词 (?:abc){2} abcabc
    (?iLmsux) iLmsux 中的每个字符代表一种匹配模式,只能用在正则表达式的开头,可选多个 (?i)abc AbC
    (?#…) # 后的内容将作为注释被忽略。 abc(?#comment)123 abc123
    (?=…) 之后的字符串内容需要匹配表达式才能成功匹配 a(?=\d) 后面是数字的 a
    (?!…) 之后的字符串内容需要不匹配表达式才能成功匹配 a(?!\d) 后面不是数字的 a
    (?<=…) 之前的字符串内容需要匹配表达式才能成功匹配 (?<=\d)a 前面是数字的a
    (?<!…) 之前的字符串内容需要不匹配表达式才能成功匹配 (?<!\d)a 前面不是数字的a
    1. package main
    2. import (
    3. "bytes"
    4. "fmt"
    5. "regexp"
    6. )
    7. func main() {
    8. // func Match(pattern string, b []byte) (matched bool, err error)
    9. // 判断在 b 中能否找到正则表达式 pattern 所匹配的子串
    10. match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
    11. fmt.Println(match) // true
    12. // 也可以这样编译后使用
    13. r, _ := regexp.Compile("p([a-z]+)ch")
    14. fmt.Println(r.MatchString("peach")) // true
    15. // func (re *Regexp) FindString(s string) string
    16. // 在 s 中查找 re 中编译好的正则表达式,并返回第一个匹配的内容
    17. fmt.Println(r.FindString("peach punch")) // peach
    18. // func (re *Regexp) FindStringIndex(s string) (loc []int)
    19. // 在 s 中查找 re 中编译好的正则表达式,并返回第一个匹配的位置
    20. // {起始位置, 结束位置}
    21. fmt.Println(r.FindStringIndex("peach punch")) // [0 5]
    22. // func (re *Regexp) FindStringSubmatch(s string) []string
    23. // 在 s 中查找 re 中编译好的正则表达式,并返回第一个匹配的内容
    24. // 同时返回子表达式匹配的内容
    25. // {完整匹配项, 子匹配项, 子匹配项, ...}
    26. fmt.Println(r.FindStringSubmatch("peach punch")) // [peach ea]
    27. // func (re *Regexp) FindStringSubmatchIndex(s string) []int
    28. // 在 s 中查找 re 中编译好的正则表达式,并返回第一个匹配的位置
    29. // 同时返回子表达式匹配的位置
    30. // {完整项起始, 完整项结束, 子项起始, 子项结束, 子项起始, 子项结束, ...}
    31. fmt.Println(r.FindStringSubmatchIndex("peach punch")) // [0 5 1 3]
    32. //func (re *Regexp) FindAllString(s string, n int) []string
    33. // 在 s 中查找 re 中编译好的正则表达式,并返回所有匹配的内容
    34. // {匹配项, 匹配项, ...}
    35. // 只查找前 n 个匹配项,如果 n < 0,则查找所有匹配项
    36. fmt.Println(r.FindAllString("peach punch pinch", -1))
    37. // [peach punch pinch]
    38. fmt.Println(r.FindAllString("peach punch pinch", 2))
    39. // [peach punch]
    40. // func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int
    41. // 在 s 中查找 re 中编译好的正则表达式,并返回所有匹配的位置
    42. // 同时返回子表达式匹配的位置
    43. // {
    44. // {完整项起始, 完整项结束, 子项起始, 子项结束, 子项起始, 子项结束, ...},
    45. // {完整项起始, 完整项结束, 子项起始, 子项结束, 子项起始, 子项结束, ...},
    46. // ...
    47. // }
    48. // 只查找前 n 个匹配项,如果 n < 0,则查找所有匹配项
    49. fmt.Println(r.FindAllStringSubmatchIndex(
    50. "peach punch pinch", -1))
    51. // [[0 5 1 3] [6 11 7 9] [12 17 13 15]]
    52. // func (re *Regexp) Match(b []byte) bool
    53. // 判断在 b 中能否找到匹配项
    54. fmt.Println(r.Match([]byte("peach"))) //true
    55. // func MustCompile(str string) *Regexp
    56. // MustCompile 的作用和 Compile 一样
    57. // 不同的是,当正则表达式 str 不合法时,MustCompile 会抛出异常
    58. // 而 Compile 仅返回一个 error 值
    59. r = regexp.MustCompile("p([a-z]+)ch")
    60. fmt.Println(r) // p([a-z]+)ch
    61. // func (re *Regexp) ReplaceAllString(src, repl string) string
    62. // 在 src 中搜索匹配项,并替换为 repl 指定的内容
    63. // 全部替换,并返回替换后的结果
    64. fmt.Println(r.ReplaceAllString("a peach", "<fruit>")) // a <fruit>
    65. // func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte
    66. // 在 src 中搜索匹配项,然后将匹配的内容经过 repl 处理后,替换 src 中的匹配项
    67. // 如果 repl 的返回值中有“分组引用符”($1、$name),则将“分组引用符”当普通字符处理
    68. // 全部替换,并返回替换后的结果
    69. in := []byte("a peach")
    70. out := r.ReplaceAllFunc(in, bytes.ToUpper)
    71. fmt.Println(string(out)) // a PEACH
    72. }