3

<regex>Visal Studio 2010 から使用しています。正規表現オブジェクトを作成するとコンパイルされることを理解しています。他の言語やライブラリのようなコンパイル方法はありませんが、それが機能する方法だと思います。

このコンパイルされた正規表現を大量にファイルに保存する必要があるため、メモリブロックのチャンクを取得してコンパイルされた正規表現を取得するだけです。

これを行う方法がわかりません。PCREでは可能ですが、Linuxライブラリです。Windows [バージョン2がありますが、それは 3 年前のものであり、より高度なアプローチを使用したいと考えています (Windows バージョンには C++ ラッパーはありません)。

save std:regexor boost::regex(それは同じ権利ですか?) をメモリのチャンクとして使用し、後でそれを再利用することは可能ですか?

または、これを可能にする Windows 用の他の単純なライブラリはありますか?

編集: 素晴らしい答えをありがとう。単純に正規表現を文字列として保存するだけで十分かどうかを確認し、それでも遅い場合はテストして、この古い PCRE ライブラリと比較します。

4

3 に答える 3

2

正規表現文字列自体を「シリアル化された」正規表現として使用できます。それらをファイルに保存するだけで、regexオブジェクトを再構成するときに、保存した文字列をregexコンストラクターに渡すだけです。

私が考えることができる唯一の欠点:

  • 正規表現データベースを「再構成」するのにもう少し時間がかかるかもしれませんが、実際にどれくらいかはわかりません (時間はとにかく I/O によって支配されると思われるので、違いが重要かどうかはわかりません) - Boost ライブラリの実装による正規表現コンパイルのオーバーヘッドがどれくらいあるかはわかりません)
  • 保存された正規表現を難読化したい場合は、コンパイルされたバイナリの状態が判読できないことに頼るのではなく、自分でそれを行う必要があります

これには次の利点があります。

  • 100% サポートされているため、壊れやすい/もろくない
  • コンパイラのバージョンとプラットフォーム間で移植可能です (つまり、壊れやすい/脆くない)。

正規表現データベースをコンパイルする時間 (I/O を除く) は、コンパイルされた状態を保存しようとすることを正当化するのに十分な時間ですか?

于 2010-12-21T18:30:19.337 に答える
1

ブーストライブラリを変更してサポートしないとできないと思います。

ブースト正規表現ライブラリがどのように実装されているかは具体的にわかりませんが、ほとんどの正規表現ライブラリはバイナリ blob にコンパイルし、後でそれを一種の限定された仮想マシン用の一連の命令として解釈します。

ブーストの正規表現ライブラリがこのように実装されている場合、シリアル化は比較的簡単です。どうにかしてバイナリブロブを取得し、ディスクにダンプします。boost ライブラリのPOSIX 正規表現 APIの存在は、おそらくこれが実装方法であることを示しています。

OTOH、それを実装する別の方法 (そしてあまり一般的ではない方法) は、正規表現の抽象構文ツリーのようなものを生成することです。これは、正規表現の個々の部分が独自のオブジェクトによって表され、それらのオブジェクトが、正規表現全体を表すより大きな構造にリンクされることを意味します。

ブーストがこのように行う場合、シリアライゼーションは非常に複雑になります。

これは C++ では不可能ですが、Boost がテンプレートのメタプログラミングを使用して、コンパイル時に定数文字列の正規表現をコンパイルできることを本当に望んでいます。これが不可能な理由は、テンプレートを使用して文字列 (定数文字列であっても) の内容を反復処理できないためです。

于 2010-12-21T14:40:11.260 に答える
0

よくわかりませんが、C++ オブジェクトをシリアル化できるboost::serializationを調べましたか?

于 2010-12-21T14:21:34.727 に答える