使用 faker 生成 java 个姓氏,但只需要字母

Use faker to generate java last names but required letters only

在我们的测试中需要使用一些名称生成器,所以我们使用了:

<dependency>
    <groupId>com.github.javafaker</groupId>
    <artifactId>javafaker</artifactId>
</dependency>

Faker faker = new Faker();
String firstName = faker.name().firstName();
String lastName = faker.name().lastName();

工作非常清楚。但是有时我们会因为在姓氏中生成 ' 而失败,例如 O'KeefeD'Amore。要求是不要在那里使用 ' 。试图修复它我在使用 faker 实例之前使用了一些表达式,如下一个:

faker.expression("[A-Za-z]+");

...和其他人(#{regexify '(A-Za-z)'}#{regexify '[A-Za-z]+'} ...),但没有帮助。 (无论如何,我可以在姓氏中检测到 '。)

有什么解决问题的想法吗?

可以使用 replaceAll 利用表达式 [^A-Za-z] 只允许字母字符:

Faker faker = new Faker();
String firstName = faker.name().firstName();
String lastName = faker.name().lastName().replaceAll("[^A-Za-z]", "");

Faker 有一堆最流行的 yml 文件 names/lastnames 等。有一堆支持的语言环境。解决问题的方法是为自定义语言环境提供自定义文件。

Faker faker = new Faker(new Locale("en","TEST"));

自定义文件示例 (en-TEST.yml):

en-TEST:
  faker:
    name:
      name:
        - "#{first_name} #{last_name}"
      first_name: [
                    Adedayo
                  ]
      last_name: [
                    Tella
                  ]

因此您可以从默认文件(en 语言环境)复制 last_name 值并删除您不喜欢的所有内容。 Faker 将选择自定义文件并将其用于随机生成。

p.s。 作为一种选择,您可以只浏览现有文件并找到一个没有错误姓氏的文件( en-NG 似乎可以满足您的需要)。但是,不能保证新版本的 faker 会保留相同的值。