V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
shangyes
V2EX  ›  分享创造

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

  •  
  •   shangyes · 2020-05-10 00:53:50 +08:00 · 1286 次点击
    这是一个创建于 1459 天前的主题,其中的信息可能已经有所发展或是发生改变。

    动机

    数据库实验要生成 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 里的有些可以解析有些报错,奇奇怪怪。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3141 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 00:19 · PVG 08:19 · LAX 17:19 · JFK 20:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.