使用Regex生成字符串而不是匹配它们

And*_*Law 100 java regex

我正在编写一个Java实用程序,它可以帮助我生成大量数据以进行性能测试.这将是真的很酷,能够让自己的发电机吐出来匹配这个哪些事情来指定字符串正则表达式.有什么东西已经烘烤,我可以用它来做到这一点?或者是否有一个图书馆让我在那里大部分时间?

谢谢

Che*_*oft 37

编辑:

正如评论中所述,Google Code上有一个库可用于实现此目的:http: //code.google.com/p/xeger

又见https://github.com/mifmif/Generex所建议Mifmif

原始信息:

首先,有足够复杂的正则表达式,我相信这是不可能的.但是你应该能够将一些东西组合在一起以获得简单的正则表达式.

如果你看一下java.util.regex.Pattern类的源代码,你会发现它使用了Node实例的内部表示.每个不同的模式组件都有自己的Node子类实现.这些节点组织成一棵树.

通过生成遍历此树的访问者,您应该能够调用重载的生成器方法或某种将某些内容拼凑在一起的构建器.

  • “首先,如果正则表达式足够复杂,我相信这是不可能的。” -- 这**不完全正确**:任何针对 _something_ 传递的正则表达式也可以生成有效的输入。说明:正则表达式是乔姆斯基层次结构中的类型 3,这意味着它们可以表示为 FSM。当单步执行 FSM 时,每个边都被解释为下一个字符的规则,因此 FSM 可用于_解析_或_生成_序列。如果FSM有到终端的路径,则可以确定有效的序列。因此,如果没有通往终端的路径(这将是一个无用的正则表达式),那么它只是“不可能”。 (3认同)
  • 我不确定 Xeger 是否那么好。它无法处理字符类。它无法识别简单的 `[\w]`。查看 [他们的 wiki](https://code.google.com/archive/p/xeger/wikis/XegerLimitations.wiki) 的最后一行告诉我们这一点。 (2认同)
  • 还要注意,这些依赖于 `dk.brics.automaton`,所以准备添加 3rd 方 pom 依赖项。大多数人不介意,但我希望有一些更紧凑的东西。 (2认同)

Wil*_*ger 19

Xeger(Java)也能够做到这一点:

String regex = "[ab]{4,6}c";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);
Run Code Online (Sandbox Code Playgroud)

  • Xeger 很好用。但请确保您在类路径或 pom/gradle 中有 [automaton jar](https://mvnrepository.com/artifact/dk.brics.automaton/automaton/1.11-8) (2认同)

Mif*_*mif 19

帮助原始海报为时已晚,但它可以帮助一个新人.Generex是一个有用的java库,它提供了许多使用正则表达式生成字符串的功能(随机生成,根据索引生成字符串,生成所有字符串......).

示例:

Generex generex = new Generex("[0-3]([a-c]|[e-g]{1,2})");

// generate the second String in lexicographical order that matches the given Regex.
String secondString = generex.getMatchedString(2);
System.out.println(secondString);// it print '0b'

// Generate all String that matches the given Regex.
List<String> matchedStrs = generex.getAllMatchedStrings();

// Using Generex iterator
Iterator iterator = generex.iterator();
while (iterator.hasNext()) {
    System.out.print(iterator.next() + " ");
}
// it prints 0a 0b 0c 0e 0ee 0e 0e 0f 0fe 0f 0f 0g 0ge 0g 0g 1a 1b 1c 1e
// 1ee 1e 1e 1f 1fe 1f 1f 1g 1ge 1g 1g 2a 2b 2c 2e 2ee 2e 2e 2f 2fe 2f 2f 2g
// 2ge 2g 2g 3a 3b 3c 3e 3ee 3e 3e 3f 3fe 3f 3f 3g 3ge 3g 3g 1ee

// Generate random String
String randomStr = generex.random();
System.out.println(randomStr);// a random value from the previous String list
Run Code Online (Sandbox Code Playgroud)

  • 看起来Generex是你自己的项目.根据规则[这里](http://stackoverflow.com/help/behavior),你介意在你的帖子中提到这是你自己的项目吗? (11认同)

Vla*_*ans 11

这个问题真的很老,尽管这个问题对我来说是实际的。我试过xegerGenerex,但它们似乎不符合我的要求。他们实际上无法处理一些正则表达式模式(如a{60000})或其他(如(A|B|C|D|E|F)),他们只是不产生所有可能的值。由于我没有找到任何其他合适的解决方案 - 我创建了自己的库。

https://github.com/curious-odd-man/RgxGen

该库可用于生成匹配和非匹配字符串。

maven central 上也有神器可用。

用法示例:

RgxGen rgxGen = new RgxGen(aRegex);                     // Create generator
String s = rgxGen.generate();                           // Generate new random value
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了 RxGen,它比 Xeger 和 Generex 效果好得多 (2认同)

Gor*_*ran 5

我已经为此滚动了我自己的库(在 c# 中,但对于 Java 开发人员来说应该很容易理解)。

Rxrdg 最初是为了解决为现实生活项目创建测试数据的问题。基本思想是利用现有(正则表达式)验证模式来创建符合此类模式的随机数据。这样就创建了有效的随机数据。

为简单的正则表达式模式编写解析器并不难。使用抽象语法树生成字符串应该更容易。