许多程序语言都支持使用正则表达式对字符串进行操作,Go语言也不例外,正则表达式的语法网上很多教程,本文主要介绍在Go语言中如何使用正则表达式,通过以下实例进行说明,并添加了详细的注释,不会的小伙伴一看就明白了。
创新互联从2013年成立,先为容城等服务建站,容城等地企业,进行企业商务咨询服务。为容城企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
func main() {
// 要操作的字符串
str := "abcde 1234 my@163.com 386832092@qq.com admin@hotmail.com"
// 正则表达式字符串----用于匹配邮箱地址,来源于网络
regexStr := "([A-Za-z0-9\u4e00-\u9fa5]+)@([a-zA-Z0-9_-]+)(\\.[a-zA-Z0-9_-]+)+"
// 定义正则表达式
match := regexp.MustCompile(regexStr)
// 或者
//match,err := regexp.Compile(regexStr)
// 或者
//match := regexp.MustCompile(regexStr)
// 判断是否存在正则表达式匹配的字符串========方法1
// 此处用于判断str中是否存在邮箱地址
isExist := match.MatchString(str)
fmt.Println(isExist)
// 执行结果:true
// 判断是否存在正则表达式匹配的字符串========方法2
// 此处用于判断"8888888888"中是否存在邮箱地址
isExist1, _ := regexp.MatchString(regexStr, "8888888888")
fmt.Println(isExist1)
// 执行结果:false
// 查询左边第一次匹配的字符串
// 此处用于查询str中左边第一个邮箱地址
findS1 := match.FindString(str)
fmt.Println(findS1)
// 执行结果:my@163.com
// 查询从左边开始匹配的n个字符串,为-1时,则全部匹配,返回是一个string切片
// 此处用于查询str中左边开始2个邮箱地址
findS2 := match.FindAllString(str, 2)
fmt.Printf("%T====%v\n", findS2, findS2)
// 执行结果:[]string====[my@163.com 386832092@qq.com]
// 查询从左边开始匹配的第一个字符串,返回的是下标,是一个int切片
// 此处用于查询str中左边第一个邮箱地址在str中的下标
findS3 := match.FindStringIndex(str)
fmt.Printf("%T====%v\n", findS3, findS3)
// 执行结果:[]int====[11 21]
fmt.Println(str[findS3[0] : findS3[1]])
// 执行结果:my@163.com
// 子匹配,只匹配从左边开始的第一个字符串,在正则表达式中每一个小括号里的内容为一个子串,返回一个string切片
// 此处用于匹配str中左边第一个邮箱地址,并匹配第一个邮箱地址中的子串
findS4 := match.FindStringSubmatch(str)
fmt.Printf("%T====%v\n", findS4, findS4)
// 执行结果:[]string====[my@163.com my 163 .com]
// 其中my和163及.com都是子串
// 子匹配,只匹配从左边开始的第一个字符串,返回一个记录下标的int切片
// 此处用于匹配str中左边第一个邮箱及其子串的下标
findS5 := match.FindStringSubmatchIndex(str)
fmt.Printf("%T====%v\n", findS5, findS5)
// 执行结果:[]int====[11 21 11 13 14 17 17 21]
// 其中11 21是my@163.com的下标,11 13是my的下标,14 17是163的下标,17 21是.com的下标
// 子匹配,匹配从左边开始的n个字符串,为-1时则匹配所有,返回一个二维string切片
// 此处用于匹配str中所有邮箱地址,及这些邮箱地址中的子串
findS6 := match.FindAllStringSubmatch(str, -1)
fmt.Printf("%T====%v\n", findS6, findS6)
// 执行结果:[][]string====[[my@163.com my 163 .com] [386832092@qq.com 386832092 qq .com] [admin@hotmail.com admin hotmail .com]]
// 子匹配,匹配从左边开始的n个字符串,为-1时则匹配所有,返回一个记录下标的二维int切片
// 此处用于匹配str中所有邮箱地址及这些邮箱地址中的子串的下标
findS7 := match.FindAllStringSubmatchIndex(str, -1)
fmt.Printf("%T====%v\n", findS7, findS7)
// 执行结果:[][]int====[[11 21 11 13 14 17 17 21] [22 38 22 31 32 34 34 38] [39 56 39 44 45 52 52 56]]
// 使用byte切片作为参数和返回值
// 此处用于匹配str中第一个邮箱地址,以byte切片作为参数和返回值
findS8 := match.Find([]byte(str))
fmt.Printf("%T====%v====%s\n", findS8, findS8, findS8)
执行结果:[]uint8====[109 121 64 49 54 51 46 99 111 109]====my@163.com
// 使用byte切片作为参数,判断是否有匹配的字符串
// 此处用于判断str中是否存在邮箱地址,以byte切片为参数
findS9 := match.Match([]byte(str))
fmt.Printf("%T====%v\n", findS9, findS9)
// 执行结果:bool====true
// 字符串替换,返回替换后的字符串
// 此处用于将str中所有邮箱地址替换为""
findS10 := match.ReplaceAllString(str, "")
fmt.Printf("%T====%v\n", findS10, findS10)
// 执行结果:string====abcde 1234
// 字符串替换,使用函数作为替换参数
// 此处用于将str中的所有邮箱地址替换为下面replace的返回值
findS11 := match.ReplaceAllStringFunc(str, replace)
fmt.Printf("%T====%v\n", findS11, findS11)
// 执行结果:string====abcde 1234 my的邮箱 你好中国 你好中国
// 字符串替换,用byte切片,使用函数作替换参数
// 此处用于将str中的邮箱地址全部替换为大写字母,以byte切片为参数和返回值
findS12 := match.ReplaceAllFunc([]byte(str), bytes.ToUpper)
fmt.Printf("%T====%v====%s\n", findS12, findS12, findS12)
// 执行结果:[]uint8====[97 98 99 100 101 32 49 50 51 52 32 77 89 64 49 54 51 46 67 79 77 32 51 56 54 56 51 50 48 57 50 64 81 81 46 67 79 77 32 65 68 77 73 78 64 72 79 84 77 65 73 76 46 67 79 77]====abcde 1234 MY@163.COM 386832092@QQ.COM ADMIN@HOTMAIL.COM
// \p{Unicode脚本类名} Unicode类 (脚本类) Han----中文
// 此处用于将上面"abcde 1234 my的邮箱 你好中国 你好中国"中的所有汉字查询出来
match2 := regexp.MustCompile("\\p{Han}")
findS13 := match2.FindAllString(findS11, -1)
fmt.Printf("%T====%v\n", findS13, findS13)
// 执行结果:[]string====[的 邮 箱 你 好 中 国 你 好 中 国]
}
func replace(str string) string {
if strings.EqualFold(str, "my@163.com") {
return "my的邮箱"
}
return "你好中国"
}