Java中使用Generex通过正则表达式生成样本数据

拥有可用的测试数据是大多数项目中的常见要求。然而,获取基于生产的真实测试数据总是很乏味,并且通常我们最终会创建满足开发需求的模拟数据。

我们需要generex依赖来解析我们的正则表达式并帮助我们从传递的正则表达式生成数据。

保将其添加到 pom.xml 文件中

<dependency>
      <groupId>com.github.mifmif</groupId>
      <artifactId>generex</artifactId>
      <version>1.0.2</version>
</dependency>

代码:


Generex generex= new Generex("[REGEX_HERE]");
generex.random();
// generate data

  • 我们通过将正则表达式传递给构造函数来初始化genericex实例。
  • 一旦我们有了Generex实例,我们就可以使用random()、getFirstMatch() 和 getAllMatchedStrings()等辅助方法来生成记录。

领域

  • 用户名
  • 年龄
  • 邮政编码
  • 电话号码
  • 卡号

生成用户名

为了生成用户名字段,我们将使用正则表达式 
“[a-zA-Z0–9]{18}” 

Generex username = new Generex("[a-zA-Z0-9]{18}");
System.out.println(username.random()); 
// output : 991Pod3a3ZyB87c6ni

我们还可以将名称与正则表达式混合,如下所示,使用户名具有名称+字母数字序列。

List<String> names = List.of("sam", "jam", "tam");
String namesString = names.stream().map(n -> n +
"_").collect(Collectors.joining("|"));
Generex username1 = new Generex(
"("+namesString+")([a-z0-9]{5})");
System.out.println(username1.random());
// jam_b64z5

生成年龄
对于年龄,我们使用“(1[89]|[2–9]\\d)”,这将生成 18–99 之间的年龄

Generex age = new Generex("(1[89]|[2-9]\\d)");
System.out.println(age.random());
// 20


生成邮政编码
我们使用正则表达式来表示美国邮政编码。

Generex zipCode = new Generex("\\d{5}(-)\\d{4}");
System.out.println(zipCode.random()); 
//84042-2198


生成电话号码
使用正则表达式表示美国电话号码。

Generex phoneNumber = new Generex("([0-9]{3})-([0-9]{3})-([0-9]{4})");
System.out.println(phoneNumber.random());
// 658-101-3783

生成卡号
考虑 16 位数字模式生成卡号,这并不严格适用于所有卡,因此也许我们可以改进它,只是这里出于演示目的。

Generex cardNumber = new Generex("\\d{4}(-)\\d{4}(-)\\d{4}(-)\\d{4}");
System.out.println(cardNumber.random());
// 4737-4046-5951-7119


生成记录的辅助方法

  • 现在我们已经准备好正则表达式,让我们将它们放在一起并创建将被调用以创建模拟记录的方法generateRecords() 。

public static List<String> generateRecord(){
     Generex username = new Generex("[a-zA-Z0-9]{18}");
     List<String> names = List.of(
"sam", "jam", "tam");
     String namesString = names.stream().map(n -> n +
"_").collect(Collectors.joining("|"));
     Generex username1 = new Generex(
"("+namesString+")([a-z0-9]{5})");
     Generex cardNumber = new Generex(
"\\d{4}(-)\\d{4}(-)\\d{4}(-)\\d{4}");
     Generex age = new Generex(
"(1[89]|[2-9]\\d)");
     Generex zipCode = new Generex(
"\\d{5}(-)\\d{4}");
     Generex phoneNumber = new Generex(
"([0-9]{3})-([0-9]{3})-([0-9]{4})");
      
     List<String> fields = new ArrayList<>();
     fields.add(username1.random());
     fields.add(age.random());
     fields.add(zipCode.random());
     fields.add(phoneNumber.random());
     fields.add(cardNumber.random());
     return fields;
    }


批量生成记录
现在我们可以使用 Java 8 流中的 IntStream 来生成我们需要的范围,并调用返回列表的generateRecord()方法。
然后,我们将该字段列表映射到带有逗号的字符串,以 CSV 形式返回,但我们可以将任何映射器映射到任何格式(例如 JSON)并返回结果。
这里我们还打印到控制台来验证输出。

public static void main(String[] args) {
    List<String> records = IntStream.range(1, 100)
            .mapToObj(i -> generateRecord())
            .map(a -> String.join(",", a))
            .peek(System.out::println)
            .toList();
   
// sink the records
}