非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第16章 正则表达式
- 16.3 regexp包
- 16.3.1 MatchString函数
- 16.3.2 FindStringIndex函数
- 16.3.3 ReplaceAllString函数
- 16.4 小结
- 16.5 知识拓展
- 16.5.1 常用正则表达式参考
第16章 正则表达式
16.3 regexp包
Go在处理正则表达式时主要使用regexp包,包中实现了正则表达式的查找、替换和模式匹配功能。
16.3.1 MatchString函数
MarchString函数接收一个要查找的正则表达式和目标字符串,并根据匹配结果返回true或false,函数定义如下:
func MatchString(pattern string, s string) (matched bool, err error)
对于目标字符串“hello world”,我们通过MatchString函数匹配其中的“hello”字符串,并返回匹配结果:
[ 动手写 16.3.1]
package main
import (
"fmt"
"regexp"
)
func main() {
targetString := "hello world"
matchString := "hello"
match, err := regexp.MatchString(matchString, targetString)
if err != nil {
fmt.Println(err)
}
fmt.Println(match)
}
运行结果
程序执行结果表明匹配成功。那么,如果我们把目标字符串改为“Hello world”,匹配是否会成功呢?
[ 动手写16.3.2 ]
package main
import (
"fmt"
"regexp"
)
func main() {
targetString := "Hello world"
matchString := "hello"
match, err := regexp.MatchString(matchString, targetString)
if err != nil {
fmt.Println(err)
}
fmt.Println(match)
}
运行结果
匹配结果显示失败了,由于正则表达式区分大小写,如果要以不区分大小写的方式查找,必须修改正则表达式,使用一种特殊的语法:
matchString := "(?i)hello"
字符串开头的语法让正则表达式匹配时不区分大小写,运行修改后的示例,结果为true。
[ 动手写 16.3.3 ]
package main
import (
"fmt"
"regexp"
)
func main() {
targetString := "Hello world"
matchString := "(?i)hello"
match, err := regexp.MatchString(matchString, targetString)
if err != nil {
fmt.Println(err)
}
fmt.Println(match)
}
运行结果
没毛病。
16.3.2 FindStringIndex函数
FindStringIndex函数接收一个目标字符串,并返回第一个匹配的起始位置和结束位置,函数定义如下:
func (re *Regexp) FindStringIndex(s string) (loc []int)
由于FindStringIndex函数是Regexp结构体的成员函数,需要对正则表达式进行编译,编译成功后方能使用。
通常使用Compile或MustCompile函数进行编译。
- Compile函数:若正则表达式未通过编译,则返回错误。
- MustCompile函数:若正则表达式未通过编译,则引发panic。
对于目标字符串“hello world”,我们通过FindStringIndex函数匹配其中的“hello”字符串对应的起始和结束位置:
[ 动手写 16.3.4]
package main
import (
"fmt"
"regexp"
)
func main() {
targetString := "hello world"
re := regexp.MustCompile(`(\w)+`)
res := re.FindStringIndex(targetString)
fmt.Println(res)
}
运行结果
16.3.3 ReplaceAllString函数
ReplaceAllString函数返回第一个参数的拷贝,将第一个参数中所有re的匹配结果都替换为repl,函数定义如下:
func (re *Regexp) ReplaceAllString(src, repl string) string
同样对于目标字符串“hello world”,我们通过ReplaceAllString函数匹配其中的“o”字符并将其替换为“O”:
[ 动手写 16.3.5]
package main
import (
"fmt"
"regexp"
)
func main() {
targetString := "hello world"
re := regexp.MustCompile(`o`)
res := re.ReplaceAllString(targetString, "O")
fmt.Println(res)
}
运行结果
没毛病。
16.4 小结
- 正则表达式是符合一定规则的表达式,用于匹配字符串中字符组合的模式。
- 正则表达式的设计思想就是使用一些描述性的符号和文字为字符串定义一个规则。凡是符合这个规则的,程序就认为文本是“匹配”的,否则就认为文本是“不匹配”的。
- Go在处理正则表达式时主要使用regexp包,包中实现了正则表达式的查找、替换和模式匹配功能。
16.5 知识拓展
16.5.1 常用正则表达式参考
【1】E-mail 地址
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
【2】URL 地址
^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-])\/?$
【3】匹配首尾空白字符的正则表达式
^\s|\s$
【4】手机号码
^(13[0-9]|14[0-9]|15[0-9]|166|17[0-9]|18[0-9]|19[8|9])\d{8}$
【5】电话号码
^(\d{3,4}-)?\d{7,8}$
【6】18位身份证号码(数字、字母x结尾)
^((\d{18})|([0-9x]{18})|([0-9X]{18}))$
【7】账号是否合法(5~16字节,允许字母、数字、下划线,以字母开头)
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
【8】一年的12个月(01~09和1~12)
^(0?[1-9]|1[0-2])$
【9】日期格式(2018-01-01只做粗略匹配,格式不限制,二月有30天等)
^\d{4}-\d{1,2}-\d{1,2}$
【10】一个月的31天(01~09和1~31)
^((0?[1-9])|((1|2)[0-9])|30|31)$
【11】IP 地址
^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$