准则
  • 默认是最短匹配,只要字符串满足条件就返回。
  • 如果没有匹配到,都是返回为nil
  • 如果需要做最长匹配,调用Longest()函数。
  • 正则表达式功能:匹配(macth),查找(find)和替换(replace)。
  • 存在长度选择的函数,传入<0的数字表示匹配全部。
使用regexp调用

Match,MatchReader和 MatchString

Compile 和 MushCompile

  • func Compile(expr string) (*Regexp, error)
  • func MustCompile(str string) *Regexp

Compile:返回Regexp对象,方便调用指针函数。

MustCompile:同Compile,解析表达式失败,会panic。

在匹配文本时,该正则表达式会尽可能早的开始匹配,并且在匹配过程中选择回溯搜索到的第一个匹配结果。这种模式被称为leftmost-first,另外一般情况下使用MustCompile即可。

使用regexp.Regexp对象来调用

Find 和 FindAll

  • func (re *Regexp) Find(b []byte) []byte
  • func (re *Regexp) FindAll(b []byte, n int) [][]byte

Find返回保管正则表达式re在b中的最左侧的一个匹配结果的[]byte切片。如果没有匹配到,会返回nil,最多匹配一个。

FindAll功能与Find一样,只是返回全部满足条件的数据。

FindString 和 FindAllString

  • func (re *Regexp) FindString(s string) string
  • func (re *Regexp) FindAllString(s string, n int) []string

FindFindAll一样,只是针对字符串string操作。

FindIndex 和 FindAllIndex

  • func (re *Regexp) FindIndex(b []byte) (loc []int)

  • func (re *Regexp) FindAllIndex(b []byte, n int) [][]int

FindIndex, 返回b中满足匹配字符串部分的起始位置,同样是**“leftmost-first”**原则,loc包含起止位置。如果没有找到,直接返回nil

FindAllIndex,功能和FindIndex保持一致,只是匹配多个,n决定了匹配的位置。

FindStringIndex 和 FindAllStringIndex

  • func (re *Regexp) FindStringIndex(s string) (loc []int)
  • func (re *Regexp) FindAllStringIndex(s string, n int) [][]int

FindIndexFindAllIndex使用方式类似,只是针对的是字符串string。

FindStringSubmatch 和 FindAllStringSubmatch

  • func (re *Regexp) FindStringSubmatch(s string) []string

FindStringSubmatch:采用左匹配原则,最多匹配一个,如果没有的话,返回nil。对于返回的[]string,分别标示匹配的字符串,子串。

输出结果:

  • func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string

FindStringSubmatch使用类似,只是能顾选择匹配的长度,-1表示匹配到末尾。

输出结果:

FindSubmatchIndex 和 FindAllSubmatchIndex

  • func (re *Regexp) FindSubmatchIndex(b []byte) []int
  • func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int
    计算子串在源串中的位置,已经存在(x*)等返回结果处理,如果没有返回nil

另外,index返回为左闭右开的模式,示例中的2,2表示空字符串的意思。
并且,不会存在重合匹配的,比如说"-axxb-ab-"去匹配a(x*)b,不会存在第一个a和最后一个b结合的情况,如果使用Longest就会匹配最长的。

输出结果:

FindStringSubmatchIndex 和 FindAllStringSubmatchIndex

  • func (re *Regexp) FindStringSubmatchIndex(s string) []int
  • func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int

FindSubmatchIndexFindAllSubmatchIndex保持一致。

Longest

  • func (re *Regexp) Longest()
    获取最长匹配的满足条件的内容。

输出结果:

下面这种情况不会最长匹配。

Match,MatchString和MatchReader

  • func (re *Regexp) Match(b []byte) bool
  • func (re *Regexp) MatchString(s string) bool
  • func (re *Regexp) MatchReader(r io.RuneReader) bool

判断bsr返回的数据是否满足正则表达式,返回true或者false

NumSubexp

  • func (re *Regexp) NumSubexp() int

返回分组的数量。

输出结果:

ReplaceAll 和 ReplaceAllString

  • func (re *Regexp) ReplaceAll(src, repl []byte) []byte
  • func (re *Regexp) ReplaceAllString(src, repl string) string

ReplaceAllStringReplaceAll使用方式相同。

输出结果:

ReplaceAllFunc 和 ReplaceAllStringFunc

  • func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte
  • func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string

将匹配出来满足条件的[]byte作为参数传入函数中。

两者使用方式类似。

ReplaceAllLiteral 和 ReplaceAllLiteralString

  • func (re *Regexp) ReplaceAllLiteral(src, repl []byte) []byte
  • func (re *Regexp) ReplaceAllLiteralString(src, repl string) string

匹配字面常量,不转换。

输出结果:

关于$1说明:

Expand 和 ExpandString

  • func (re *Regexp) Expand(dst []byte, template []byte, src []byte, match []int) []byte
  • func (re *Regexp) ExpandString(dst []byte, template string, src string, match []int) []byte

Expand返回新生成的将template添加到dst后面的切片。在添加时,Expand会将template中的变量替换为从src匹配的结果。match应该是被FindSubmatchIndex返回的匹配结果起止位置索引。(通常就是匹配src,除非你要将匹配得到的位置用于另一个[]byte)

在template参数里,一个变量表示为格式如:$name${name}的字符串,其中name是长度>0的字母、数字和下划线的序列。一个单纯的数字字符名如$1会作为捕获分组的数字索引;其他的名字对应(?P...)语法产生的命名捕获分组的名字。超出范围的数字索引、索引对应的分组未匹配到文本、正则表达式中未出现的分组名,都会被替换为空切片。

$name格式的变量名,name会尽可能取最长序列:$1x等价于${1x}而非${1}x$10等价于${10}而非${1}0。因此$name适用在后跟空格/换行等字符的情况,${name}适用所有情况。

如果要在输出中插入一个字面值'$',在template里可以使用$$

其他示例

解析网址

输出结果: