go regexp简介
regexp
包借鉴了RE2
语法,很多文章描述是采用了RE2
,小弟认为,regexp
和 re2
其实是2个东西, 回过头来继续看regexp
,golang regexp
除了\C
之外,其正则表达式和Perl
以及Python
都是一样的,其语法规则和ERE
大同小异,这里就不贴了。
关于regexp
的更多文档: pkg.go.dev/regexp
go regexp小案例
匹配电话号码
我们假设从前端返回电话号码,后端在存储的时候,也需要做二次校验,格式为: 180-xxxx-xxxx
,这个我们应该如何来校验呢?
按照上述格式标准,我们可以将正则设置写为:"[\d]{3}-[\d]{4}-[\d]{4}"
,我们来看下具体程序。
package main import ( "fmt" "regexp" ) func main() { testString := []string{"180-1234-5678","179-123-45678","1234-123-3431"} for _,v := range testString { fmt.Println("正在处理: " ,v) re := "[\d]{3}-[\d]{4}-[\d]{4}" fmt.Println(regexp.MatchString(re,v)) } }
如上代码是我们测试了3组数据,分别是180-1234-5678
、179-123-45678
、1234-123-3431
,我们通过肉眼判断只有第一个是符合规则的,我们来运行代码看下呢
匹配以某结尾的字符
例如我们想匹配以hello
开头的字符且以world
结尾的字符,应该如何写呢?
匹配规则可以这样写: re := "hello(.*)world"
运行后效果如下
匹配email地址
例如有需求,需要匹配前端传入的email
地址做二次校验,规则是以 yyy@xxx.com
的格式,其中yyy
最短为6位,最长为16位,只能是字母或者数字,xxx
为三位字母。
我们可以将其规则写为: re := "[\w]{6,16}@[a-zA-Z]{3}.com"
我们运行程序后效果为
那么,最后,有这样一个问题: 若有这样一个需求,需要校验前端传入的密码复杂度,其规则为: 长度大于等于16位, 需要同时包含a-z
、A-Z
、0-9
以及特殊字符 !@#$%
其中至少一个即可,你会写这个正则表达式了么?反正我没写出来。
总结
如果你看了,上一篇文章grep
正则表达式案例,你会不会对此规则感觉很熟悉呢? 快来动手试试吧。