时间:2021-05-22
正则表达式是一种进行模式匹配和文本操纵的功能强大的工具。正则表达式灵活、易用,按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合。
准则
使用regexp调用
Match,MatchReader和 MatchString
// 判断b中是够包含pattern能够组成的任意字符串func Match(pattern string, b []byte) (matched bool, err error)// 判断reader r中返回的字符串是否包含pattern能够组成的任意字符串func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)// 判断字符串s中是否包含pattern能够组成的任意字符串func MatchString(pattern string, s string) (matched bool, err error)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
Find返回保管正则表达式re在b中的最左侧的一个匹配结果的[]byte切片。如果没有匹配到,会返回nil,最多匹配一个。
re := regexp.MustCompile(`foo.?`)fmt.Printf("%q\n", re.Find([]byte(`seafood fool`)))re := regexp.MustCompile(`foo.?`)fmt.Printf("%q\n", re.FindAll([]byte(`seafood fool`), -1))FindAll 功能与Find 一样,只是返回全部满足条件的数据。
FindString 和 FindAllString
与Find 和FindAll 一样,只是针对字符串string操作。
FindIndex 和 FindAllIndex
FindIndex , 返回b 中满足匹配字符串部分的起始位置,同样是**“leftmost-first”**原则,loc包含起止位置。如果没有找到,直接返回nil 。
FindAllIndex ,功能和FindIndex 保持一致,只是匹配多个,n 决定了匹配的位置。
FindStringIndex 和 FindAllStringIndex
与FindIndex 和FindAllIndex 使用方式类似,只是针对的是字符串string。
FindStringSubmatch 和 FindAllStringSubmatch
FindStringSubmatch :采用左匹配原则,最多匹配一个,如果没有的话,返回nil 。对于返回的[]string ,分别标示匹配的字符串,子串。
re := regexp.MustCompile(`a(x*)b(y|z)c`)fmt.Printf("%q\n", re.FindStringSubmatch("-axxxbyc-"))fmt.Printf("%q\n", re.FindStringSubmatch("-abzc-"))输出结果:
["axxxbyc" "xxx" "y"]
["abzc" "" "z"]
和FindStringSubmatch 使用类似,只是能顾选择匹配的长度,-1 表示匹配到末尾。
re := regexp.MustCompile(`a(x*)b`)fmt.Printf("%q\n", re.FindAllStringSubmatch("-ab-", -1))fmt.Printf("%q\n", re.FindAllStringSubmatch("-axxb-", -1))fmt.Printf("%q\n", re.FindAllStringSubmatch("-ab-axb-", -1))fmt.Printf("%q\n", re.FindAllStringSubmatch("-axxb-ab-", -1))输出结果:
[["ab" ""]]
[["axxb" "xx"]]
[["ab" ""] ["axb" "x"]]
[["axxb" "xx"] ["ab" ""]]
FindSubmatchIndex 和 FindAllSubmatchIndex
另外,index 返回为左闭右开 的模式,示例中的2,2 表示空字符串的意思。 并且,不会存在重合匹配的,比如说"-axxb-ab-"去匹配a(x*)b ,不会存在第一个a 和最后一个b 结合的情况,如果使用Longest 就会匹配最长的。
re := regexp.MustCompile(`a(x*)b`)// Indices:// 01234567 012345678// -ab-axb- -axxb-ab-fmt.Println(re.FindAllStringSubmatchIndex("-ab-", -1))fmt.Println(re.FindAllStringSubmatchIndex("-axxb-", -1))fmt.Println(re.FindAllStringSubmatchIndex("-ab-axb-", -1))fmt.Println(re.FindAllStringSubmatchIndex("-axxb-ab-", -1))fmt.Println(re.FindAllStringSubmatchIndex("-foo-", -1))输出结果:
[[1 3 2 2]] // 2 2 表示为空
[[1 5 2 4]]
[[1 3 2 2] [4 7 5 6]]
[[1 5 2 4] [6 8 7 7]]
[]
输出结果:
a
ab
下面这种情况不会最长匹配。
re := regexp.MustCompile(`a(x*)b`)re.Longest()fmt.Println(re.FindString("-axxb-ab-")) // axxb,不会存在第一个a和最后一个b组合的过程。Match,MatchString和MatchReader
判断b ,s 和r 返回的数据是否满足正则表达式,返回true 或者false 。
NumSubexp
返回分组的数量。
re0 := regexp.MustCompile(`a.`)fmt.Printf("%d\n", re0.NumSubexp())re := regexp.MustCompile(`(.*)((a)b)(.*)a`)fmt.Println(re.NumSubexp())输出结果:
0
4
输出结果:
-T-T-
--xx-
---
-W-xxW-
ReplaceAllFunc 和 ReplaceAllStringFunc
将匹配出来满足条件的[]byte 作为参数传入函数中。
re := regexp.MustCompile(`[^aeiou]`)fmt.Println(re.ReplaceAllStringFunc("seafood fool", strings.ToUpper))两者使用方式类似。
ReplaceAllLiteral 和 ReplaceAllLiteralString
匹配字面常量,不转换。
re := regexp.MustCompile(`a(x*)b`)fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "T"))fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "$1"))fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "${1}"))输出结果:
-T-T-
-$1-$1-
-${1}-${1}-
关于$1 说明:
Expand 和 ExpandString
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里可以使用$$ 。
其他示例
解析网址
flysnowRegexp := regexp.MustCompile(`^http://www.flysnow.org/([\d]{4})/([\d]{2})/([\d]{2})/([\w-]+).html$`)params := flysnowRegexp.FindStringSubmatch("http://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html")// 返回[]string{}数据类型for _, param := range params { fmt.Println(param)}输出结果:
http://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html
2018
01
20
golang-goquery-examples-selector
总结
到此这篇关于Go语言正则表达式的使用详解的文章就介绍到这了,更多相关Go正则表达式使用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
感谢AKA及作者。Perl中的正则表达式正则表达式的三种形式正则表达式中的常用模式正则表达式的8大原则 正则表达式是Perl语言的一大特色,也是Perl程序中
使用awk作为文本处理工具,正则表达式是少不了的。要掌握这个工具的正则表达式使用。其实,我们不必单独去学习它的正则表达式。正则表达式就像一门程序语言,有自己语法
正则表达式常用来在所有语言中搜索字符串的任何模式或文字。MongoDB还提供了正则表达式功能的字符串模式使用正则表达式$regex操作符。MongoDB使用PC
在上篇给大家介绍了Java中正则表达式的使用和详解(上),具体内容如下所示:1.常用正则表达式规则正则表达式语法一个或多个汉字^[\u0391-\uFFE5]+
Java中正则表达式运用实例(参看java中正则表达式运用详解):测试代码packagetest;/***在String的matches()方法,split()