2016-11-04 12 views
9

私のプロジェクトではstd::regexと作業しています。 私はコンパイル時に正規表現を知っているので、正規表現を構築するのは、正規表現の長さがmであるO(2^m)にあります。コンパイル時に正規表現を構築したいと思います。 はSTD ::正規表現でこれは可能ですか? を(私はbasic_regexのための任意のconstexprののctorのを参照してくださいいけないので、私は、そう思ういけない)とされていない場合、ビルドアップコンパイル時に私の正規表現はstd :: regexのコンパイル時のビルド

+0

私は個人的にコンパイル時間、起動時間、実行時間を区別します。 (技術的に起動時間はランタイムです)。私は起動時に 'regex'をビルドします。 – knivil

答えて

5

我々は区別する必要がある可能正規​​表現libaryがありますプログラムコンパイルとregexコンパイルの間。後者は実際にはプログラムランタイムで実行され、さまざまな文字列との高速マッチングに適した大型で効率的な構造(ステートマシン)を構築することを意味します。あなたは、文字列の正規表現オブジェクトを作成するとき

C++では11正規表現、正規表現のコンパイルが行われます。

std::regex e (your_re_string); 

あなたがregex_matchregex_searchregex_replaceにそのようなオブジェクトを使用する場合は、作業を活用します既にコンパイルされた正規表現を使用します。プログラムのコンパイル時に文字列を知っていれば、スピードを上げるためにできることは、プログラム実行ごとに対応する正規表現オブジェクトを1回だけ構築することです。たとえば、初期化子を持つ静的変数として宣言します。

static std::regex e (your_constant_re_string); 

おそらくあなたが望むものです。

regex_match、...の一部の形式は、代わりに正規表現の文字列ですぐに動作します。しかし、通常はプログラマにとっては便利ですが、それらを使うと、そのような関数が呼び出されるたびにregexコンパイルを実行するとパフォーマンスが低下することに注意してください。

P.S.あなたが本当に実際にあなたがプログラムコンパイル時に正規表現をコンパイルしたいのであれば、 (1)外部正規表現/レクサーコンパイラソフトウェア(https://github.com/madelson/PrecompiledRegex.Fody、フレックスhttps://en.wikipedia.org/wiki/Flex_(lexical_analyser_generator)など)を使用する (2)std::regexオブジェクトをコンパイルする(1)のDIYバージョンです) しかし、プログラムごとに1つの正規表現コンパイルを保存するだけでは価値がないと確信しています。多分あなたが本当に圧倒的な表現をしていない限り。

+2

あなたの答えをありがとう。しかし、コンパイル時に正規表現のnfa/dfaを構築することはできませんか? C++ 11とconstexprでは、これは可能なはずです。 – Exagon

+0

理論的にはそうですが、constexprコンストラクタを書くか、それが追加されるのを待つべきです。 2014年には、C++ 14またはC++ 17で期待されていました。それでも私はそれが追加されたのか分からない。そうでない場合、あなたはそれを寄付することができます。これは技術的な作業ですが、一部のオペレータがconstexprをまだサポートしていないことがあります。 –

+0

このようなコンパイラが必要だったら、単に関数 "storeAsCPPSource(const regex&)"を作成し、オブジェクトをコンパイルして保存する単純なアプリケーションを作成するだけです。 –

3

ハナDusikova "Regular Expressions Redefined in C++”によるCppCon 2017の雷講演では、正規表現文字列にユーザ定義のリテラルを使用してコンパイル時の正規表現を使用する方法と、マッチング関数を生成するコンパイル時のアプローチについて説明しました。 code is on GitHubが、実験的であり、現時点では非常に流動的である。だから、コンパイル時の正規表現はたぶんすぐに現れると思われる。

関連する問題