私のプロジェクトではstd::regex
と作業しています。 私はコンパイル時に正規表現を知っているので、正規表現を構築するのは、正規表現の長さがmであるO(2^m)にあります。コンパイル時に正規表現を構築したいと思います。 はSTD ::正規表現でこれは可能ですか? を(私はbasic_regex
のための任意のconstexprののctorのを参照してくださいいけないので、私は、そう思ういけない)とされていない場合、ビルドアップコンパイル時に私の正規表現はstd :: regexのコンパイル時のビルド
答えて
我々は区別する必要がある可能正規表現libaryがありますプログラムコンパイルとregexコンパイルの間。後者は実際にはプログラムランタイムで実行され、さまざまな文字列との高速マッチングに適した大型で効率的な構造(ステートマシン)を構築することを意味します。あなたは、文字列の正規表現オブジェクトを作成するとき
C++では11正規表現、正規表現のコンパイルが行われます。
std::regex e (your_re_string);
あなたがregex_match
、regex_search
、regex_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つの正規表現コンパイルを保存するだけでは価値がないと確信しています。多分あなたが本当に圧倒的な表現をしていない限り。
あなたの答えをありがとう。しかし、コンパイル時に正規表現のnfa/dfaを構築することはできませんか? C++ 11とconstexprでは、これは可能なはずです。 – Exagon
理論的にはそうですが、constexprコンストラクタを書くか、それが追加されるのを待つべきです。 2014年には、C++ 14またはC++ 17で期待されていました。それでも私はそれが追加されたのか分からない。そうでない場合、あなたはそれを寄付することができます。これは技術的な作業ですが、一部のオペレータがconstexprをまだサポートしていないことがあります。 –
このようなコンパイラが必要だったら、単に関数 "storeAsCPPSource(const regex&)"を作成し、オブジェクトをコンパイルして保存する単純なアプリケーションを作成するだけです。 –
ハナDusikova "Regular Expressions Redefined in C++”によるCppCon 2017の雷講演では、正規表現文字列にユーザ定義のリテラルを使用してコンパイル時の正規表現を使用する方法と、マッチング関数を生成するコンパイル時のアプローチについて説明しました。 code is on GitHubが、実験的であり、現時点では非常に流動的である。だから、コンパイル時の正規表現はたぶんすぐに現れると思われる。
- 1. C++でstd :: regexのコンパイル時間を短縮する
- 2. mac/linux用にコンパイル時のstd :: pairエラー
- 3. 角型CLI Typescriptコンパイル時のビルド
- 4. C++ 14コンパイル時std :: array with variadic templates
- 5. のVisual Studio 11のコンパイル時にエラー使用してのstd ::マップ
- 6. std :: function:コンパイル時の引数の厳密な検証
- 7. コンパイル時のテンプレートテンプレートタイプ
- 8. Xcodeビルド - スウィフトソースファイルのコンパイル
- 9. はSTDをコンパイル:: gccの
- 10. コンパイル時に `std :: initializer_list`のサイズを取得します
- 11. コンパイル時にstd :: initializer_listの内容を検証する
- 12. コンパイル時にstd :: bitsetのサイズを調べる方法
- 13. std :: coutはコンパイル時に相当する、またはstatic_assert C++でのコンパイル時定数値の文字列化11
- 14. gccのstd :: regex無限ループ5.4
- 15. ウィジェットセットのコンパイル時にMavenビルドが失敗する
- 16. コンパイル時/ビルド後の依存性注入IoC?
- 17. g ++ 6.1コンパイル時の回帰?
- 18. コンパイル時間Bimap static_assertのエラー
- 19. コンパイル時のベクトルpush_backエラー
- 20. コンパイル時のコード生成
- 21. コンパイル時にstd :: setを入力しますか?
- 22. コンパイル時に静的const std :: mapを初期化しますか?
- 23. コンパイル時にC++ std :: bitsetを初期化する
- 24. コンパイル時にC++でstd :: reference_wrapperを検出する方法
- 25. std :: arrayクラスメンバはコンパイル時に設定されていますか?
- 26. SFINAEのstd :: enable_if_t&std :: is_base_ofを使ってコンパイル時の継承をチェックする方法は?
- 27. ビルドまたはコンパイル
- 28. std :: bindはMSVCのstd :: atomic_bool&でコンパイルできません
- 29. gSOAP Webservice、コンパイル時のエラー
- 30. コンパイル時にコンパイル時にHaxe
私は個人的にコンパイル時間、起動時間、実行時間を区別します。 (技術的に起動時間はランタイムです)。私は起動時に 'regex'をビルドします。 – knivil