Go每日一库之53:commonregex

简介

有时,我们会遇到一些需要使用字符串的匹配和查找的任务。并且我们知道这种情况下,使用正则表达式是最简洁和优雅的。为了完成某个任务特地去系统地学习正则表达式费时费力,而且一段时间不用又很容易遗忘。下次遇到问题还要再重复这个过程。commonregex库来了,它内置很多常用的正则表达式,开箱即用。当然,我并不是说没必要去学习正则表达式,熟练掌握正则表达式需要时间和练习,对于时长和文本处理打交道的开发人员,正则表达式决定是提升工作效率的一把利器。

快速使用

本文代码使用 Go Modules。

创建目录并初始化:

bash 复制代码
$ mkdir commonregex && cd commonregex
$ go mod init github.com/go-quiz/go-daily-lib/commonregex

安装commonregex库:

bash 复制代码
$ go get -u github.com/mingrammer/commonregex

简单使用:

go 复制代码
package main

import (
  "fmt"

  cregex "github.com/mingrammer/commonregex"
)

func main() {
  text := `John, please get that article on www.linkedin.com to me by 5:00PM on Jan 9th 2012. 4:00 would be ideal, actually. If you have any questions, You can reach me at (519)-236-2723x341 or get in touch with my associate at harold.smith@gmail.com`

  dateList := cregex.Date(text)
  timeList := cregex.Time(text)
  linkList := cregex.Links(text)
  phoneList := cregex.PhonesWithExts(text)
  emailList := cregex.Emails(text)

  fmt.Println("date list:", dateList)
  fmt.Println("time list:", timeList)
  fmt.Println("link list:", linkList)
  fmt.Println("phone list:", phoneList)
  fmt.Println("email list:", emailList)
}

运行结果:

bash 复制代码
$ go run main.go
date list: [Jan 9th 2012]
time list: [5:00PM 4:00 ]
link list: [www.linkedin.com harold.smith@gmail.com]
phone list: [(519)-236-2723x341]
email list: [harold.smith@gmail.com]

commonregex提供的 API 非常易于使用,调用相应的类别方法返回一段文本中符合这些格式的字符串列表。上面依次从text获取日期列表时间列表超链接列表电话号码列表电子邮件列表

内置的正则

commonregex支持很多常用的正则表达式:

  • 日期;
  • 时间;
  • 电话号码;
  • 超链接;
  • 邮件地址;
  • IPv4/IPv6/IP 地址;
  • 价格;
  • 十六进制颜色值;
  • 信用卡卡号;
  • 10/13 位 ISBN;
  • 邮政编码;
  • MD5;
  • SHA1;
  • SHA256;
  • GUID,全局唯一标识;
  • Git 仓库地址。

每种类型又支持多种格式,例如日期支持09.11.2020/Sep 11th 2020

下面挑选几种类型来介绍。

日期

go 复制代码
func main() {
  text := `commonregex support many date formats, like 09.11.2020, Sep 11th 2020 and so on.`
  dateList := commonregex.Date(text)

  fmt.Println(dateList)
}

匹配出来的日期(注意 Go 中 slice 的输出):

bash 复制代码
[09.11.2020 Sep 11th 2020]

时间

时间相对来说格式单一一些,有 24 小时制的时间如:08:30/14:35,有 12 小时制的时间:08:30am/02:35pm

看示例:

go 复制代码
func main() {
  text := `I wake up at 08:30 (aka 08:30am) in the morning, take a snap at 13:00(aka 01:00pm).`
  timeList := commonregex.Time(text)

  fmt.Println(timeList)
}

匹配出来的时间列表:

bash 复制代码
[08:30  08:30am 13:00 01:00pm]

IP/MAC/MD5

使用方法都是类似的,这几个放在一起举例。

IPv4 地址是 4 个以.分隔的数字,每个数字都在[0-255]范围内。

MAC 是计算机的物理地址(又叫以太网地址,局域网地址等),是 6 组以:分隔的十六进制数字,每组两个。

MD5 是一种哈希算法,将一段数据转为长度为 32 的字符串。

go 复制代码
func main() {
  text := `mac address: ac:de:48:00:11:22, ip: 192.168.3.20, md5: fdbf72fdabb67ea6ef7ff5155a44def4`

  macList := commonregex.MACAddresses(text)
  ipList := commonregex.IPs(text)
  md5List := commonregex.MD5Hexes(text)

  fmt.Println("mac list:", macList)
  fmt.Println("ip list:", ipList)
  fmt.Println("md5 list:", md5List)
}

输出:

bash 复制代码
mac list: [ac:de:48:00:11:22]
ip list: [192.168.3.20]
md5 list: [fdbf72fdabb67ea6ef7ff5155a44def4]

总结

commonregex足够我们去应付一般的使用场景了。

大家如果发现好玩、好用的 Go 语言库,欢迎到 Go 每日一库 GitHub 上提交 issue

参考

  1. commonregex GitHub:github.com/mingrammer/...
  2. Go 每日一库 GitHub:github.com/go-quiz/go-...
相关推荐
梁梁梁梁较瘦2 天前
边界检查消除(BCE,Bound Check Elimination)
go
梁梁梁梁较瘦2 天前
指针
go
梁梁梁梁较瘦2 天前
内存申请
go
半枫荷2 天前
七、Go语法基础(数组和切片)
go
梁梁梁梁较瘦2 天前
Go工具链
go
半枫荷2 天前
六、Go语法基础(条件控制和循环控制)
go
半枫荷4 天前
五、Go语法基础(输入和输出)
go
小王在努力看博客4 天前
CMS配合闲时同步队列,这……
go
Anthony_49264 天前
逻辑清晰地梳理Golang Context
后端·go
Dobby_055 天前
【Go】C++ 转 Go 第(二)天:变量、常量、函数与init函数
vscode·golang·go