使用正则表达式生成字符串而不是匹配它们
我正在编写一个Java实用程序,它可以帮助我生成大量用于性能测试的数据。能够为字符串指定一个正则表达式,以便我的生成器吐出与此匹配的内容,这将是非常酷的。有没有已经烘烤过的东西,我可以用来做到这一点?还是有一个图书馆可以让我大部分时间都在那里?
谢谢
我正在编写一个Java实用程序,它可以帮助我生成大量用于性能测试的数据。能够为字符串指定一个正则表达式,以便我的生成器吐出与此匹配的内容,这将是非常酷的。有没有已经烘烤过的东西,我可以用来做到这一点?还是有一个图书馆可以让我大部分时间都在那里?
谢谢
编辑:
关于这个问题的建议库的完整列表:
* - 取决于dk.brics.automaton
编辑:如评论中提到的,Google Code上有一个库可以实现这一目标:https://code.google.com/archive/p/xeger/
另请参阅 Mifmif 建议的 https://github.com/mifmif/Generex
原始消息:
首先,有了足够复杂的正则表达式,我相信这是不可能的。但是你应该能够把一些东西放在一起,用于简单的正则表达式。
如果你看一下java.util.regex.Pattern类的源代码,你会发现它使用了Node实例的内部表示。每个不同的模式组件都有自己的 Node 子类实现。这些节点被组织成一棵树。
通过生成遍历此树的访问者,您应该能够调用重载的生成器方法或某种拼凑在一起的生成器。
现在帮助原始海报为时已晚,但它可以帮助新人。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
披露
这篇文章中提到的项目属于回答(Mifmif)问题的用户。根据规则,这需要提出来。