所以,如果我有简单的正则表达式,例如:
"g{1,3}(a|e|i|o|u)"
我希望我的程序生成
字符串ga
ge
gi
go
gu
gga
gge
ggi
ggo
ggu
ggga
ggge
gggi
gggo
gggu
我不会对正则表达式使用“g *(a | e | i | o | u)”,因为可以有无数个'g'并且会有无数个字符串。
有关简单高效算法的任何建议吗? 我想我可以通过使用for / while循环以暴力方式制作这些字符串,但我想知道是否有任何方法可以用来使这个算法工作。
我用谷歌搜索如何从正则表达式创建字符串,许多人似乎重定向到: https://code.google.com/p/xeger/ 使用构建的库,但我想知道我是否可以为这些简单的正则表达式提供一些建议。
答案 0 :(得分:1)
Xeger是开源的。您可以浏览他们的代码库以获取想法。
编辑:
他们的代码库看起来很小,所以不应该太难。它只生成匹配的随机字符串,而不是所有字符串。尽管如此,它仍然是一个很好的起点。
答案 1 :(得分:1)
我创建了Debuggex,它会生成随机字符串,让您了解正则表达式的作用。
如果您的正则表达式已经有一个解析树,则可以使用以下逻辑生成随机匹配:
OrTree.random:
Choose a child randomly, return its random()
ConcatTree.random:
For every child, call random()
Return the concatenation of all the results
RepeatTree.random:
Choose a valid random number of repetitions within min and max
Call random() on your child that many times
Return the concatenation of all the results
Literal.random:
Return the literal
即使您使用*
运算符,也可以生成随机字符串。这是通过选择从0到无穷大的分布来生成数字,就像使用有限集的均匀分布一样。例如:
InfiniteRepeatTree.random:
Flip a coin until I get tails
Call random on child() the number of times that the coin landed heads
Return concatenation of the results
希望有所帮助:)
答案 2 :(得分:0)
char[] vowels = new char[] {'a','e','i','o','u'};
for (int i = 1; i <= 3; i++) {
for (int j = 0; j < vowels.length; j++) {
for (int k = 0; k < i; k++) {
System.out.print("g");
}
System.out.println(vowels[j]);
}
}
不是通用的解决方案,但它适用于您的特定示例