私は最近こういうことをやっていて、それを解決するのにかなりの時間がかかったので、これが私のやり方です。ただし、これにはもっと単純なアルゴリズムがあるかもしれません。
再帰下降パーサーを記述して、テキストをツリーに変換できます。その文字列を保持する文字列リーフノードと、一致する中括弧のペアを内部ノードにします。各リーフノードには、複数の文字列を含めることができます。
たとえば、これは次のとおりです。
/a/{b,c}/{d,e{f,g,h}}/i
になることができる:
(
["/a/"]
{
( ["b"] )
( ["c"] )
}
["/"]
{
( ["d"] )
(
["e"]
{
( ["f"] )
( ["g"] )
( ["h"] )
}
)
}
["i"]
)
これをツリーとして見てみてください。ここで、["stringA", "stringB"]
はリーフノードを表し、一致する中括弧のペアは内部ノードを表します。内部ノードには2つのタイプがあり、1つは選択肢の1つ({}
この例で使用)から選択でき、もう1つはすべての組み合わせを組み合わせたもの(()
ここで使用)です。
したがって、上記のツリーは次のようになります。
(
["/a/"]
{
["b"]
["c"]
}
["/"]
{
["d"]
(
["e"]
{
["f"]
["g"]
["h"]
}
)
}
["i"]
)
それから
(
["/a/"]
["b", "c"]
["/"]
{
["d"]
(
["e"]
["f", "g", "h"]
)
}
["i"]
)
それから
(
["/a/"]
["b", "c"]
["/"]
{
["d"]
["ef", "eg", "eh"]
}
["i"]
)
それから
(
["/a/"]
["b", "c"]
["/"]
["d", "ef", "eg", "eh"]
["i"]
)
そして最後に、すべての組み合わせである単一のリーフノードになります。
["/a/b/di", "/a/b/efi", "/a/b/egi", "/a/b/ehi",
"/a/c/di", "/a/c/efi", "/a/c/egi", "/a/c/ehi"]
次に、それをきれいに印刷できます。