示例:在字符串 1000abcd123 中找出前后两个数字。

例子1:匹配到这个字符串的例子

package main import(    "fmt"    "regexp") var digitsRegexp = regexp.MustCompile(`(\d+)\D+(\d+)`) func main(){    someString:="1000abcd123"    fmt.Println(digitsRegexp.FindStringSubmatch(someString))}

上面代码输出:

[1000abcd123 1000 123]

例子2:使用带命名的正则表达式

package main import(    "fmt"    "regexp") var myExp=regexp.MustCompile(`(?P<first>\d+)\.(\d+).(?P<second>\d+)`) func main(){    fmt.Printf("%+v",myExp.FindStringSubmatch("1234.5678.9"))}

上面代码输出,所有匹配到的都输出了:

[1234.5678.9 1234 5678 9]

这里的Named capturing groups (?P<name>) 方式命名正则表达式是 python、Go语言特有的, java、c# 是 (?<name>) 命名方式。

例子3:对正则表达式类扩展一个获得所有命名信息的方法,并使用它。

package main import(    "fmt"    "regexp") //embed regexp.Regexp in a new type so we can extend ittype myRegexp struct{     *regexp.Regexp} //add a new method to our new regular expression typefunc(r *myRegexp)FindStringSubmatchMap(s string) map[string]string{    captures:=make(map[string]string)     match:=r.FindStringSubmatch(s)    if match==nil{        return captures    }     for i,name:=range r.SubexpNames(){        //Ignore the whole regexp match and unnamed groups        if i==0||name==""{            continue        }         captures[name]=match[i]     }    return captures} //an example regular expressionvar myExp=myRegexp{regexp.MustCompile(`(?P<first>\d+)\.(\d+).(?P<second>\d+)`)} func main(){    mmap:=myExp.FindStringSubmatchMap("1234.5678.9")    ww:=mmap["first"]    fmt.Println(mmap)    fmt.Println(ww)}


上面代码的输出结果:

map[first:1234 second:9]
1234

例子4,抓取限号信息,并记录到一个Map中。

package main import(    "fmt"    iconv "github.com/djimenez/iconv-go"    "io/ioutil"    "net/http"    "os"    "regexp") // embed regexp.Regexp in a new type so we can extend ittype myRegexp struct{    *regexp.Regexp} // add a new method to our new regular expression typefunc(r *myRegexp)FindStringSubmatchMap(s string)[](map[string]string){    captures:=make([](map[string]string),0)     matches:=r.FindAllStringSubmatch(s,-1)     if matches==nil{        return captures    }     names:=r.SubexpNames()     for _,match:=range matches{         cmap:=make(map[string]string)         for pos,val:=range match{            name:=names[pos]            if name==""{                continue            }             /*                fmt.Println("+++++++++")                fmt.Println(name)                fmt.Println(val)            */            cmap[name]=val        }         captures=append(captures,cmap)     }     return captures} // 抓取限号信息的正则表达式var myExp=myRegexp{regexp.MustCompile(`自(?P<byear>[\d]{4})年(?P<bmonth>[\d]{1,2})月(?P<bday>[\d]{1,2})日至(?P<eyear>[\d]{4})年(?P<emonth>[\d]{1,2})月(?P<eday>[\d]{1,2})日,星期一至星期五限行机动车车牌尾号分别为:(?P<n11>[\d])和(?P<n12>[\d])、(?P<n21>[\d])和(?P<n22>[\d])、(?P<n31>[\d])和(?P<n32>[\d])、(?P<n41>[\d])和(?P<n42>[\d])、(?P<n51>[\d])和(?P<n52>[\d])`)} func ErrorAndExit(err error){    fmt.Fprintln(os.Stderr,err)    os.Exit(1)} func main(){    response,err:=http.Get("http://www.bjjtgl.gov.cn/zhuanti/10weihao/index.html")    defer response.Body.Close()     if err!=nil{        ErrorAndExit(err)    }     input,err:=ioutil.ReadAll(response.Body)    if err!=nil{        ErrorAndExit(err)    }    body :=make([]byte,len(input))    iconv.Convert(input,body,"gb2312","utf-8")     mmap:=myExp.FindStringSubmatchMap(string(body))     fmt.Println(mmap)}

上述代码输出:

[map[n32:0 n22:9 emonth:7 n11:3 n41:1 n21:4 n52:7 bmonth:4 n51:2 bday:9 n42:6 byear:2012 eday:7 eyear:2012 n12:8 n31:5]map[emonth:10 n41:5 n52:6 n31:4 byear:2012 n51:1 eyear:2012 n32:9 bmonth:7 n22:8 bday:8 n11:2 eday:6 n42:0 n21:3 n12:7]map[bday:7 n51:5 n22:7 n31:3 eday:5 n32:8 byear:2012 bmonth:10 emonth:1 eyear:2013 n11:1 n12:6 n52:0 n21:2 n42:9 n41:4]map[eyear:2013 byear:2013 n22:6 eday:10 bmonth:1 n41:3 n32:7 n31:2 n21:1 n11:5 bday:6 n12:0 n51:4 n42:8 emonth:4 n52:9]]

更多go语言知识请关注PHP中文网go语言教程栏目。

更多相关文章

  1. 代码详解使用Go基于WebSocket构建视频直播弹幕系统
  2. Golang中Bit数组如何实现(代码示例)
  3. 关于go值传递和地址传递的例子
  4. 在java中使用dom4j解析xml(示例代码)
  5. Java生成和解析XML格式文件和字符串的实例代码
  6. php 修改、增加xml结点属性的实现代码
  7. php操作XML、读取数据和写入数据的实现代码
  8. 解析php DOMElement 操作xml 文档的实现代码
  9. XML解析之SAX解析过程代码详解

随机推荐

  1. Go语言异常处理的方法介绍
  2. golang怎么拼接字符串数组
  3. golang使用protobuf的方法详解
  4. golang怎么定时任务
  5. golang如何写http请求
  6. go语言结构体组合函数介绍
  7. golang错误抛出的方法
  8. golang测试是否能ping通
  9. golang怎样读取json数据
  10. golang怎么判断channel是否关闭