go语言正则表达式

我们前两节课爬取珍爱网的时候,用到了很多正则表达式去匹配城市列表、城市、用户信息,其实除了正则表达式去匹配,还可以利用goquery和xpath第三方库匹配有用信息。而我利用了更优雅的正则表达式匹配。下来大概介绍下正则表达式。

比如我们匹配城市列表的时候,会取匹配所有城市的url,如下:

可以看到图片后是小写字母加数字,那么就可以用以下方式提取:

<a href="(http://www.zhenai.com/zhenghun/[0-9a-z]+)"[^>]*>([^<]+)</a>

[0-9a-z]+表示匹配小写字母或者数字至少一次,[^>]*表示匹配非>的字符任意次,然后[^<]+表示匹配非<字符至少一次。我们要取到城市的url和城市名,所以对进行了分组。

通过以下方式就可以拿到url和city

const (
    cityListReg = `<a href="(http://www.zhenai.com/zhenghun/[0-9a-z]+)"[^>]*>([^<]+)</a>`
  )

  compile := regexp.MustCompile(cityListReg)

  submatch := compile.FindAllSubmatch(contents, -1)

  for _, m := range submatch {
    fmt.Println("url:" , string(m[1]), "city:", string(m[2]))
  }

匹配包含g g,且gg中间至少一个小写字母:

//匹配包含g g,且gg中间至少一个小写字母
 match, _ := regexp.MatchString("g([a-z]+)g", "11golang11")
 //true
 fmt.Println(match)

上面我们直接使用了字符串匹配的正则表达式,但是对于其他的正则匹配任务,需要使用一个优化过的正则对象:

compile, err := regexp.Compile("smallsoup@gmail.com")

  if err != nil {
    //....正则语法错误,需要处理错误
    fmt.Println(err)
  }

  //smallsoup@gmail.com
  fmt.Println(compile.FindString(text))

compile, err :=regexp.Compile("smallsoup@gmail.com")

函数返回一个正则表达式匹配器和错误,当参数正则表达式不符合正则语法时返回error,比如说regexp.Compile("[smallsoup@gmail.com")就会报错missing closing ]

一般正则表达式是用户输入的才需要处理错误,而自己写的一般是不会有错的,所以可以使用compile:= regexp.MustCompile("smallsoup@gmail.com"),如果语法错误,就会发生panic。

text1 := `my email is aa@qq.com
   aa email is aa@gmail.com
   bb email is bb@qq.com
   cc email is cc@qq.com.cn
   `
  //如果要提取A@B.C中的A、B、C,需要用到正则表达式的提取功能。
  comp := regexp.MustCompile(`([a-zA-Z0-9]+)@([a-zA-Z0-9.]+)\.([a-zA-Z0-9]+)`)

  //利用自匹配获取正则表达式里括号中的匹配内容
  submatchs := comp.FindAllStringSubmatch(text1, -1)

  //submatchs其实是一个二维数组
  fmt.Println(submatchs)

  //去除每个匹配,submatch其实还是个slice
  for _, submatch := range submatchs {
    fmt.Println(submatch)
  }

结果输出如下:

[[aa@qq.com aa qq com] [aa@gmail.com aa gmail com] [bb@qq.com bb qq com] [cc@qq.com.cn cc qq.com cn]]
[aa@qq.com aa qq com]
[aa@gmail.com aa gmail com]
[bb@qq.com bb qq com]
[cc@qq.com.cn cc qq.com cn]
r := regexp.MustCompile("p([a-z]+)ch")
  fmt.Println(r) //----->p([a-z]+)ch
  //regexp 包也可以用来替换部分字符串为其他值。
  fmt.Println(r.ReplaceAllString("a peach", "<smallsoup>")) //----->a <smallsoup>
  //Func 变量允许传递匹配内容到一个给定的函数中,
  in := []byte("a smallsoup")
  out := r.ReplaceAllFunc(in, bytes.ToUpper)
  fmt.Println(string(out)) //----->a PEACH
  /*#######################常见表达式###########################*/
  // 查找汉字
  testText := "Hello 你好吗, I like golang!"
  reg := regexp.MustCompile(`[\p{Han}]+`)
  fmt.Println(reg.FindAllString(testText, -1)) // ----->[你好]
  reg = regexp.MustCompile(`[\P{Han}]+`)
  fmt.Println(reg.FindAllString(testText, -1))        // ----->["Hello " ", I li golang!"]
  fmt.Printf("%q\n", reg.FindAllString(testText, -1)) // ----->["Hello " ", I lm golang!"]
  //Email
  reg = regexp.MustCompile(`\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*`)
  fmt.Println(reg.MatchString("smallsoup@qq.com"))
  //用户名密码:
  reg = regexp.MustCompile(`[a-zA-Z]|\w{6,18}`)
  fmt.Println(reg.MatchString("w_dy_246"))

运行结果如下:

p([a-z]+)ch
a <smallsoup>
a smallsoup
[你好吗]
[Hello  , I like golang!]
["Hello " ", I like golang!"]
true
true

Process finished with exit code 0

原文发布于微信公众号 - 我的小碗汤(mysmallsoup)

原文发表时间:2018-06-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Go 语言简介(上)— 语法

Hello World package main //声明本文件的package名 import "fmt" //import语言的fmt库——用于输出 f...

4048
来自专栏吴伟祥

YAML 语言入门教程 转

YAML 仍然是一门标记性语言,但为了强调这门语言以数据为中心,而不是以标记语言为中心。采用反向缩略语重新命名。

753
来自专栏TungHsu

这或许是对小白最友好的python入门了吧——6,删除列表元素

这个时候我们CET考完了,怎么才能把它删除呢。这时候我们可以用del这个函数,用法如下: del exam[0] print(exam) #print的作用...

3698
来自专栏峰会SaaS大佬云集

C#学习---基础入门(四)C#中的字符与字符串

字符 char(单个字符) 用单引号 ,例如char a=‘a’;可以通过调用char类下的方法进行一些操作,具体通过help查看其相关方法

1274
来自专栏大前端_Web

SASS相关

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

1951
来自专栏C/C++基础

web前端开发初学者十问集锦(4)

利用JS来控制页面控件的显示和隐藏有两种方法,两种方法分别利用HTML的style中的两个属性,两种方法的不同之处在于控件隐藏后是否还在页面上占空位。

1752
来自专栏禹都一只猫博客

GO 语言简介 — 语法

下面的文章主要是以代码和注释为主。只需要你对C语言,Unix,Python有一点基础,我相信你会在30分钟左右读完并对Go语言有一些初步了解的。

1031
来自专栏ACM算法日常

棋盘(数学趣味题) - HDU 5100

Consider the problem of tiling an n×n chessboard by polyomino pieces that are k×...

823
来自专栏阮一峰的网络日志

YAML 语言教程

编程免不了要写配置文件,怎么写配置也是一门学问。 YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。 本文介绍 YAML 的语法,...

3406
来自专栏Python爬虫实战

Google Python风格规范(上)

好的代码风格,给人舒服的感觉,今天介绍一下谷歌的Python风格规范,由于规范比较多,将分为两次介绍。

1132

扫码关注云+社区

领取腾讯云代金券