首页 > 技术文章 > golang 正则表达式的使用和问题

nickchou 2020-03-24 00:39 原文

一、正则表达式多匹配+group
源字符串如下,要提取其中的 11.html/11/北京市

<tr class='provincetr'><td><a href='11.html'>北京市<br/></a></td><td><a href='12.html'>天津市

golang代码如下,FindAllSubmatch参数-1是取所有匹配的字符串(也可以填数字取具体个数),其中str[0]是匹配的总字符串,str[1]=group[1]

reg, _ := regexp.Compile("<a href='((\\d+).html)'>([\u4e00-\u9fa5]+)")
allstr := reg.FindAllSubmatch([]byte(html), -1)
for _, str := range allstr {
    fmt.Println(string(str[1])) //11.html
    fmt.Println(string(str[2])) //11
    fmt.Println(string(str[3])) //北京市
}

二、正则表达式替换
想实现的效果,把下面

[江苏省(320000)|PROV|0|][苏州市(320500)|CITY|0|][吴江区(320509)|AREA|0|][双板桥路()|ROAD|1|52号$]附近

转换为:

江苏省苏州市吴江区双板桥路52号附近

下面是正确的golang代码

reg := regexp.MustCompile("\\[([^\\(]+)\\(\\d*\\)\\|\\w*\\|\\d\\|([^\\]\\$]*)\\$?\\]")
fmt.Println(dis.Address)
dis.Address = reg.ReplaceAllString(dis.Address, "$1$2")
fmt.Println(dis.Address)

下面的代码是同样的效果下和regexbuddy的语法,和golang的语法主要区别在:转义符要多一个\

\[([^\(]+)\(\d*\)\|\w*\|\d\|([^\]\$]*)\$?\]

总结如下

  1. 正常的表达式中\w是能识别中文,但是golang似乎并不可以,需要用[\u4e00-\u9fa5]显示指定
  2. golang的转义符要用\\
  3. \w \d 等常用的也要用 \\w \\d 来表示
  4. regexp.MustCompile(``)这种写法还有待尝试

推荐阅读