一、简介
这里介绍在go中使用正则表达式。
二、知识点
2.1 正则表达式模块regexp
go中正则表达式依赖模块为regexp,编码中引入示例如下:
import (
"regexp"
)
2.1 预编译语法
go中正则表达式依赖模块为regexp,正则表达式预编译方法主要有:Compile、MustCompile、CompilePOSIX、MustCompilePOSIX。
2.1.1 Compile
Compile方法,返回结果包含err字段,采用最左最短方式搜索,源码定义如下:
func Compile(expr string) (*Regexp, error) {}
使用示例:
reg, _ := regexp.Compile(`<.*?>`)
2.1.2 MustCompile
MustCompile同Compile一样,只是返回结果没有err字段,出错时直接抛异常,源码定义如下:
func MustCompile(str string) *Regexp {}
使用示例:
mustReg := regexp.MustCompile(`<.*?>`)
2.1.3 CompilePOSIX
CompilePOSIX同Compile类似,预编译正则表达式,采用posix语法,最左最长方式搜索,不支持\w,\W等perl写法,源码定义如下:
func CompilePOSIX(expr string) (*Regexp, error) {}
使用示例:
posixReg, _ := regexp.CompilePOSIX(`<.*?>`)
2.1.4 MustCompilePOSIX
MustCompilePOSIX同CompilePOSIX类似,只是返回结果没有err字段,出错时直接抛异常,源码定义如下:
func MustCompilePOSIX(str string) *Regexp {}
使用示例:
mustPosixReg, _ := regexp.MustCompilePOSIX(`<.*?>`)
三、使用示例
go正则表达式常用有匹配判断、查找、分组、替换。下面分别介绍。 测试串定义为:
text := "<p>apple study hard ,好好学习, 11 2333 33 study, good,天天向上 study 1243 53, </p>"
3.1 匹配判断
匹配判断使用Match方法或MatchString方法,两者区别仅是Match参数为字节类型,MatchString为字符串类型。使用示例:
//匹配,参数为字符串
matchResult,_ := regexp.MatchString("study", text)
(matchResult) //true
//匹配,参数为[]byte
byteMatchResult,_ := regexp.Match(`\d+`, []byte(text))
(byteMatchResult) //true
3.2 查找
查找主要方法有FindString、FindAllString、FindStringIndex,使用示例如下:
//查询所有,指定参数最多查询个数为2, 负数表示查所有,如-1
queryAllResult := regexp.MustCompilePOSIX(`study`).FindAllString(text, 2)
(queryAllResult) //[study study]
//查询第一个匹配字符串
queryResult := regexp.MustCompile("study").FindString(text)
(queryResult) //study
//最短匹配
shortTxt := regexp.MustCompile(`st|study`).FindString(text)
(shortTxt) //st
//最长匹配
longTxt := regexp.MustCompilePOSIX(`st|study`).FindString(text)
(longTxt) //study
//查询匹配串位置
findIdxResult := regexp.MustCompile(`study`).FindStringIndex(text)
println(findIdxResult)
//Unicode使用,如\p{Han}表示中文
hanResult := regexp.MustCompile(`[\p{Han}]+`).FindString(text)
println(hanResult) //好好学习
//非贪婪,添加标识?
notGreedyResult := regexp.MustCompile(`\d+?3`).FindString(text)
println(notGreedyResult) //23
//贪婪
greedyResult := regexp.MustCompile(`\d+3`).FindString(text)
println(greedyResult) //2333
//分组
groupResult := regexp.MustCompile(`(\d+)\s+(\d+)`).FindString(text)
println(groupResult) //11 2333
//分组打标签
tagGroupResult := regexp.MustCompile(`(?P<tagName_1>\d+)\s+(?P<tagName_2>\d+)`).FindString(text)
println(tagGroupResult) //11 2333
//非贪婪模式标识:(?U),切换为贪婪模式用方法Longest
notGreedyReg := regexp.MustCompile(`(?U)\d+3`)
notGreedyResult := no(text)
println(notGreedyResult) //23
//通过方法Longest转为贪婪模式
no()
changeGreedyResult := no(text)
println(changeGreedyResult) //2333
//贪婪模式,不带标识(?U)
greedyResult := regexp.MustCompile(`\d+3`).FindString(text)
println(greedyResult)//2333
3.3 替换
替换主要方法有ReplaceAllString、ReplaceAllStringFunc,其中ReplaceAllStringFunc表示使用自定义方法定义替换规则。使用示例如下:
//自定义替换规则函数
func updateDisplose(text string) string{
if (text, "5"){
return text+"++"
}
return text
}
//替换
updateResult := regexp.MustCompile("<.*?>").ReplaceAllString(text, "")
(updateResult) //apple study hard ,好好学习, 11 2333 33 study, good,天天向上 study 1243 53,
//替换,使用函数指定替换规则
updateFuncResult := regexp.MustCompile(`\d+`).ReplaceAllStringFunc(text, updateDisplose)
println(updateFuncResult) //<p>apple study hard ,好好学习, 11 2333 33 study, good,天天向上 study 1243 53++, </p>
//分组查找替换
expandReg := regexp.MustCompile(`(\w+).*(\d+)`)
template := "hello $1, study $2"
//dst := "info:"
//subMatchIdx := ex(text)
//expandResult :=ex([]byte(dst), template, text, subMatchIdx)
expandResult :=ex(nil, template, text, ex(text))
("%s\n", expandResult) //hello p, study 3
四、备注
正则表达式语法在各语言中写法是一致的,具体写法在此略过,更多操作请相看go源码或api文档。
4.1 相关参与地址
正则表达式关于unicode编码参考地址:
posixy语法参考地址: