随机生成器匹配正则表达式?

3

是否有任何Go包接收正则表达式作为输入并返回与该正则表达式匹配的随机字符串,或者您可以指导我如何实现这样的解决方案?

我的第一个想法是从/dev/rand中循环生成随机字节,然后返回与正则表达式匹配的一项,但我认为这种暴力破解会耗费时间,直到找到与正则表达式匹配的字符串。

用例:

我计划将其用于Web服务测试库。

  • 一些API调用,例如注册用户帐户,需要唯一字段,例如电子邮件地址、电话号码等,因此需要基于模式/正则表达式的随机输入生成器。

  • 随机属性还有助于防止过时数据/误报(即存储在当前测试套件之前的数据)。我想生成器不需要提供密码级别的随机性,而是类似GUID的东西。


3
正则表达式 .* 应该匹配任何字符串,包括空字符串。 - hek2mgl
2
Xeger。目前还没有Go版本,但Python版本可以使用。 - Wiktor Stribiżew
1
我并不认为你所要求的解决方案实际上是你使用情况下的好选择。生成各种随机字符串很容易,但正则表达式并不适用于严格匹配电子邮件地址和电话号码,因此我不明白为什么这些随机字符串需要特别严格格式化。(编写一个可以验证电子邮件地址的正则表达式是非常复杂的...) - LemurFromTheId
1
@Theu,我可能会编写一些自定义生成器(电子邮件、电话),以及一些通用的“给我一个由[xyz]字符组成的长度为N的字符串”的函数。你真的需要一个格式完全相同的虚假电话号码吗?你知道世界上有多少种表示有效电话号码的方式吗? - LemurFromTheId
1
@JimB,我正在开发的测试框架/工具主要用于测试应用程序的逻辑,而不是验证规则。随机性是一种解决冲突和陈旧数据的功能。对于规则验证,我认为需要一个专门的工具,可能类似于/基于Go Fuzz(github.com/dvyukov/go-fuzz)。简而言之,随机输入生成器将回答这个需求:“给我一个以前没有使用过的有效[电话号码/电子邮件等]!”,以便我可以用它来注册一个虚假/测试用户。生成的输入必须是随机的(如GUID),以避免数据库连接。 - The user with no hat
显示剩余11条评论
1个回答

6

Reggen是我编写的一个库,可以从正则表达式生成字符串。它可用于生成您需要的电子邮件地址/电话号码以及使用正则表达式指定的任何其他内容。

通常情况下,提供的正则表达式越具体,结果就越好。例如,正则表达式.*@.*\..*可能会生成类似于F$-^@A"%mk.^uv的东西,但[a-z]+@[a-z]+\.(com|net|org)应该会生成更易读的内容,如bfeujqp@qtpqby.com

使用该库生成电子邮件地址:

import "github.com/lucasjones/reggen"

func main() {
    str, err := reggen.Generate("^[a-z]{5,10}@[a-z]{5,10}\\.(com|net|org)$", 10)
    if err != nil {
        panic(err)
    }
    fmt.Println(str)
}

典型输出:
tpbry@sfmxet.net

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接