次のような数式を含む n (〜50000) 行の長いリストがあります。
A(1, 2) = 54353
A(1, 2, 3) = 89327
A(1, B(1, 2)) = 8372
A(7, B(1, 3, 5)) = 6311
A(7, B(C(1, 3, 7), 2, C(1, 3), 5)) = 28490
B(A(1, C(5, 3)), 3, 8, D(1, 2)) = 39783
等
これらの式には、リテラル ( 1
、2
、3
、5
など) と関数呼び出し (A(x, y)
またはA(x, y, z)
またはB(x, y)
) が含まれます。関数の引数は、リテラルまたは他の (ネストされた) 関数呼び出しのいずれかにすることもできます。機能 ( A
、B
、C
など) は固定されており、その数はそれほど多くありません (12 程度の場合もあります)。
これで、完全な式または*
グロブ文字として機能するパターンのいずれかを使用してクエリを実行しました。
A(1, 2) => [54353]
A(1, *) => [54353, 89327, 8372]
A(*, 3) => [89327]
A(*, B(*)) => [8372, 6311, 28490]
A(*, B(*, 3, *)) => [6311]
基本的に、2 つの質問があります。
それを行う方法: 実際、私は良い基本的なパターン マッチング アルゴリズムを知りません。* を含む式を正規表現に変換しようとしましたが、単純な例では機能しますが、残念ながら、より複雑なものでは失敗します。
Converting: 'A(*, B(*, 3, *))' => /^A\(.*, B\(.*, 3, .*\)\)$/ True positive: 'A(7, B(1, 3, 5))' =~ /^A\(.*, B\(.*, 3, .*\)\)$/ False positive: 'A(7, B(C(1, 3, 7), 2, C(1, 3), 5))' =~ /^A\(.*, B\(.*, 3, .*\)\)$/
これらのブレース式を逆ポーランド記法に変換してから、通常の正規表現アプローチを適用すると役立つと思いますが、よくわかりません。
How to do it fast : すべてのクエリに対して ~50000 の一致を実行するよりも速く実行する方法についてのアイデアは大歓迎です。ここである種の FSM を使用することは可能ですか?