13

私は C++ でいくつかの正規表現を実行したかったので、interwebz (はい、私は C++ の初心者/中級者です) を調べたところ、この SO answerが見つかりました。

boost::regex と boost::xpressive のどちらを選択すればよいか、本当にわかりません。長所/短所は何ですか?

また、boost::regex とは対照的に、boost::xpressive がヘッダーのみのライブラリであることも読みました。Linux と Windows で boost::regex を静的にコンパイルするのは難しいですか (ほとんどの場合、クロスプラットフォーム アプリケーションを作成します)。

コンパイル時間の比較にも興味があります。私は現在boost::xpressiveを使用して実装していますが、コンパイル時間にはあまり満足していません(ただし、boost::regexとの比較はありません)。

もちろん、正規表現の実装に関する他の提案も受け付けています。要件は無料 (ビールと同様) で、 http://nclabs.org/license.phpと互換性があります。

4

5 に答える 5

4

かなり重要な違いの 1 つは、Boost Regex が Unicode サポート (文字クラスなど) のために ICU へのリンクをサポートできることです。 Boost Regex ICU Support .

私の知る限り、Boost Xpressive にはこの種のサポートが組み込まれていません。

于 2011-06-08T02:00:56.293 に答える
2

実行時に正規表現を作成する必要がある場合(つまり、ユーザーが正規表現を入力して検索できるようにする場合)xpressiveは、コンパイル時のみであるため、使用できません。

一方、これはコンパイル時の構成であるため、オプティマイザーのメリットはオプティマイザーよりも多くなりますregex

Boost.MPL、StateChart、Spiritを使って十分な作業を行っているので、220KBのコンパイラの警告やエラーはあまり気になりません。それがあなたにとって地獄のように聞こえる場合は、Boost.Regexを使い続けてください。

xpressiveを使用する場合は、オンにすることを強くお勧めします。-Wfatal-errorsこれにより、最初の「error:」行の後でコンパイル(およびそれ以降のエラー)が停止します。

コンパイル時については、コンテストではありません。Boost.Regexはより高速になります*。xpressiveがMPLを使用するという事実により、コンパイル時間が劇的に増加します。

*これは、dll/soを1回だけビルドすることを前提としています

于 2011-05-13T19:41:51.510 に答える
2

コンパイル時正規表現(CTR)と実行時(動的)正規表現(RTR)のトピックをより理論的な方法で深く掘り下げて、他の人の回答を補足しようと思います(このトピックは、OPの質問によって間接的に暗示されていますIMHO) . 実行時の正規表現は、歴史的な理由により、よりよく知られており、人気があります (ほとんどの言語コア ライブラリの実装)。CTR とは異なり、正規表現が実行時に決定される場合は問題ありません。どちらも有限状態機械ベースで動作します。

RTRは、ある種のユニバーサル有限状態マシンによって「コンパイル」および解釈されます(ユニバーサルとは、実行時にスキームが与えられ、内部データ構造で「コンパイル」されるその種類のインタープリターを意味します-正規表現文字列を渡すと、実行時に解釈されます-時間)。

ただし、CTR はコンパイル時に「コンパイル」され、特定の正規表現に固有であるため、正規表現が実行時に指定された場合 (テキスト エディター、ファイル/インターネット検索エンジンなどのアプリケーション) は使用できません。

しかし、コンパイル時の有限状態マシンでカスタマイズされたものは、このマシンのテーブルプリセットスキームを使用したインタープリターよりも効率的であるため、アプリオリに効率的です(理論的には)(いくつかの同様のケースは、リフレクションフィールドアクセスとコンパイル時のアクセス、または特殊なそこに指摘されているように、いくつかの固定パラメータ用に最適化された関数)。もう 1 つの利点は、コンパイル時の構文チェックです。CTR は、メタプログラミングやコード生成によって実装できます。

具体的な実装については、多くの RTR がありますが、CTR はそれほど多くありません。C++ の場合は、上記の Boost および STL C++0x11 実装です。正規表現のパフォーマンス/生成されたコードのサイズ/メモリ使用量を最適化するために必要になる場合があり、主に組み込みシステムまたは高パフォーマンスの特定のアプリケーションに関連します。 CTR に関する SO の質問 CTR の実装を見つけるのは難しいです。見つかった場合の 1 つの例は、Re2C コード ジェネレーター プロジェクト、Java CTR の実装、および Regex のランタイム コンパイル (内部データ構造ではなく IL コードへの) を特徴とする C# の実装です [SO に関する質問がありますそれ]

PS申し訳ありませんが、評判のために関連するリンクを投稿できませんでした

于 2015-08-22T11:56:58.077 に答える
2

Boost ライブラリを使用する場合、プラットフォーム間の互換性の問題から、ヘッダーのみのライブラリを使用する傾向があります。そのマイナス面は、コンパイラがライブラリの使用に関連するエラーを報告すると、ヘッダーのみの出力が難解になる傾向があることです。

于 2011-05-12T18:54:50.133 に答える
2

かなり最近のコンパイラを使用していると仮定すると、正規表現パッケージが既に含まれている可能性がかなりあります。やってみて#include <regex>、コンパイラがそれを見つけるかどうかを確認してください。

唯一の秘訣は、2 つの異なる名前空間のいずれか (または両方) に存在する可能性があることです。正規表現は C++ 標準の TR1 に含まれており、C++11 (の最終ドラフト) にも含まれています。TR1 バージョンは、ライブラリの残りの部分と同様tr1に、標準バージョンが にあるという名前の名前空間にあります。std

FWIW、これはBoost XpressiveではなくBoost正規表現と本質的に同じです。

于 2011-05-12T19:13:56.993 に答える