ER - 根据正则生成随机字符串的 Go 包/CLI

2020-05-10 00:53:50 +08:00
 shangyes

动机

数据库实验要生成 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"))
}

可能的用途

  1. 批量生成域名然后查询
  2. 生成 mock 数据
  3. 用来随机生成密码
  4. ...

已知问题

Go 的 regexp 实现不支持零宽断言。

反思

自己用了之后第一感觉就是这名字太不顺眼了,不过算是比较好的表达了 re - re 的意思吧(?有吗),哈哈。

写完之后查了一下同类的 Go 实现,差不多都一样用的是 regexp/syntax ,顿时感觉有点挫败,😂重复造了一个烂大街的轮子。

然后就是 Go 的 regexp 的 Unicode Class 我下午没整太明白,https://en.wikipedia.org/wiki/Unicode_character_property 里的有些可以解析有些报错,奇奇怪怪。

1303 次点击
所在节点    分享创造
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/670145

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX