如何从简单的正则表达式生成字符串?

时间:2013-03-28 18:36:27

标签: java regex

所以,如果我有简单的正则表达式,例如:

"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/ 使用构建的库,但我想知道我是否可以为这些简单的正则表达式提供一些建议。

3 个答案:

答案 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]);
    }
}

不是通用的解决方案,但它适用于您的特定示例