英文:
Random generator matching regexp?
问题
有没有一个Go包可以接收一个正则表达式作为输入,并返回一个匹配该正则表达式的随机字符串,或者你可以指导我如何实现这样的解决方案?
我的第一个想法是从/dev/rand中循环生成随机字节,然后返回一个与正则表达式匹配的字符串,但我认为这种暴力破解的方法会耗费很多时间,直到找到一个与正则表达式匹配的字符串。
用例:
我计划将其用于一个Web服务测试库。
-
一些API调用,比如注册用户账户,需要唯一字段,比如电子邮件地址、电话号码等,因此需要基于模式/正则表达式的随机输入生成器。
-
随机属性还有助于防止陈旧的数据/误报(即存储在当前测试套件之前的数据)。我猜生成器不需要提供密码级别的随机性,而是类似GUID的东西。
英文:
Is there any go package that receives a regex as input and returns a random string matching that regex or can you direct me how such a solution can be implemented?
My first thought is to generate random bytes in a loop from /dev/rand and then return one that matches the regex but I think this kind of brute-force would be time consuming until I find one such string matching the regex.
Use case:
I'm planning to use this for a web service testing library.
-
Some API calls such registering an user account requires unique fields such an email address, phone number etc thus the need of a random input generator based on a patter/regex.
-
The random property also helps to safeguard against stale data /false positives (i.e. data that was stored before the current test suite). I guess the generator doesn't need to provide cryptography level randomness but rather something like GUID.
答案1
得分: 5
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
英文:
Reggen is a library that I've written that can generate strings from regular expressions. It can be used to generate the email addresses/phone numbers you need, and anything else specified with a regular expression.
In general the more specific the provided regular expressions are, the better results it gives. For example, the regex .*@.*\..*
might generate something like F$-^@A"%mk.^uv
, but [a-z]+@[a-z]+\.(com|net|org)
should result in something more readable like bfeujqp@qtpqby.com
Generating an email address with the library:
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)
}
Typical output:
tpbry@sfmxet.net
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论