1

したがって、次のような単純な正規表現がある場合:

"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/にリダイレクトし て、構築されたライブラリを使用しているように見えましたが、いくつかの提案を得ることができるかどうか疑問に思っていましたこれらの単純な正規表現については私自身のものです。

4

3 に答える 3

1

Xeger はオープンソースです。コードベースを参照してアイデアを探すことができます。

編集:

彼らのコードベースは非常に小さいように見えるので、それほど難しいものではありません. すべての文字列ではなく、一致するランダムな文字列のみを生成します。しかし、それはまだ良い出発点になる可能性があります。

于 2013-03-28T18:47:16.797 に答える
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

それが役立つことを願っています:)

于 2013-03-28T18:53:58.733 に答える
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]);
    }
}

一般的な解決策ではありませんが、特定の例では機能します

于 2013-03-28T18:48:04.067 に答える