数据库实验要生成 mock 数据,为了方便准备搞一个根据表结构生成 mock 数据的工具,计划的第一步就是做这个反向正则。
Go 的官方 regexp/syntax
包提供了现成的正则解析功能,直接拿来生成解析树后递归 switch...case...
来生成随机字符串。
仓库: https://github.com/unbyte/er
本地有 Go 的情况下直接 go get
获得可执行程序。
go get -u github.com/unbyte/er/cmd/er
er --help
其他情况下进仓库 Release 页面手动下载。
使用↓
> er --help
Usage of ER CLI:
-a, -amount int
amount of strings to be generated. default to 1. (default 1)
-p, -pattern string
pattern string
Syntax: https://golang.org/pkg/regexp/syntax/
Unicode Class: https://en.wikipedia.org/wiki/Unicode_character_property
> er -p "\d{3}-\d{8}|\d{4}-\d{7}" -a 10
454-16390004
0913-1976506
543-75125853
280-27961072
5049-7522609
7833-1752530
822-89737417
7176-8019427
5181-6167904
090-60481568
> er -p "[😂-😍]+"
😇😅😋😊😃😉😊😂😆😍😊😈😍😇😍😄😇😍😂😆😉😌😅😅😊😃😃😇😂😌😉😋😉😆😆😂😄😍😂😍😇😄😃😄😂😈😂😌😉😌😅😇😂
当然也可以用作 package:
go get -u github.com/unbyte/er
import (
"github.com/unbyte/er"
"regexp/syntax"
)
func main(){
pattern := "^[A-Za-z_]{10,14}$"
generator, err := er.Parse(pattern, syntax.Perl)
if err != nil {
panic(err)
}
s, err := generator.Generate()
if err != nil {
panic(err)
}
fmt.Println(s)
ss, err := generator.GenerateMultiple(10)
if err != nil {
panic(err)
}
fmt.Println(strings.Join(ss, "\n"))
}
Go 的 regexp 实现不支持零宽断言。
自己用了之后第一感觉就是这名字太不顺眼了,不过算是比较好的表达了 re - re
的意思吧(?有吗),哈哈。
写完之后查了一下同类的 Go 实现,差不多都一样用的是 regexp/syntax
,顿时感觉有点挫败,😂重复造了一个烂大街的轮子。
然后就是 Go 的 regexp
的 Unicode Class 我下午没整太明白,https://en.wikipedia.org/wiki/Unicode_character_property 里的有些可以解析有些报错,奇奇怪怪。