C ++:どの正規表現ライブラリを使用すればよいですか?[閉まっている]


107

私は、Linuxベースのシステムで実行される商用(オープンソースではない)C ++プロジェクトに取り組んでいます。C ++コード内でいくつかの正規表現を実行する必要があります。(私は知っています:私は今2つの問題を抱えています。)

質問:C / C ++から正規表現を定期的に行う人は、どのライブラリを検討することをお勧めしますか?簡単な検索で、次のことに注意が向けられました。

1)Boost.Regex(Boostソフトウェアライセンスを読む必要がありますが、この質問はソフトウェアライセンスに関するものではありません)

2)C(C ++ではない)POSIX正規表現(#include <regex.h>、regcomp、regexecなど)

3)http://freshmeat.net/projects/cpp_regex/ (これについては何も知りません。GPLのようですので、このプロジェクトでは使用できません)


20
場合には誰もがヒントを、この古い質問を見ている...新しいライブラリが言及されるに値することが最近まで示してきた:GoogleのRE2: code.google.com/p/re2
ステファン・

2
これは、新しいPCRE2(PCREの改訂版)ライブラリのc ++ラッパーです。
Jahid

回答:


80

Boost.Regexは非常に優れており、C ++ 0x標準の一部になる予定です(すでにTR1に含まれています)。

個人的には、Boost.Xpressiveを使用する方がずっと便利です。これはヘッダーのみのライブラリであり、静的正規表現(コンパイル時にコンパイルされる正規表現)など、いくつかの優れた機能を備えています。

更新: C ++ 11準拠のコンパイラを使用している場合(gcc 4.8はサポートされていません)、他に何かを使用する十分な理由がない限り、std :: regexを使用してください。


4
Boostにはバグが多く、コーディング標準とQAプロセスが欠けているようです。本番ソフトウェアにはあまり適していません。これには、(C ++ではなく)Cを使用するRegexギアが含まれ、sprintfなどの安全でない関数によるバッファオーバーフローが含まれます。監査後に多数のバグを報告したところ、報告から数か月後に「未確認」のままでした。自己責任。
jww

8
ほぼ5年後、私は今日std :: regexを使用しようとしましたが、GCCにはまだ実装されていません。参照してくださいstackoverflow.com/questions/15671536/...
ステファン・

2
std :: regexまたはboost :: regexを使用しないことの正当な理由は、そのboost :: regexがre2よりも約10倍遅いためです
Arsen Zahray

3
@jwwいいえ、C ++標準(C ++ 03 TR、C ++ 11、およびC ++ 1y)は、いくつかの追加ライブラリを標準組み込むことを決定しました。つまり、すべての実用的な目的のために、Boost 標準を作成しました。「たぶん」のようなイタチ単語を使用し、個人攻撃を使用して証拠なしでアサーションを作成しても、Boostの大部分がC ++であるという事実は変わりません。C++の最新の方向性を定義する多くの人々もBoostに取り組んでいます。
アリス

3
@Alice-CおよびC ++委員会が標準を作成します。ライブラリは組み込まれていません。彼らが図書館を作っていることを私は知りません。
jww 2014

22

すべての提案をありがとう。

今日はいくつかのことを試しましたが、私たちがやろうとしていることを踏まえて、他のサードパーティのライブラリをダウンロードする必要がない最も簡単なソリューションを選びました。最後に、#include <regex.h>を使用して、標準のC POSIX呼び出しregcomp()およびregexec()を使用しました。C ++ではありませんが、ピンチでこれが最も簡単であることがわかりました。


19

過去のC ++プロジェクトでは、PCREを使用して成功しました。多くの注目度の高いプロジェクトで使用されているため、非常に完全で十分にテストされています。そして最近、GoogleもPCRE用のC ++ラッパーのセットを提供したようです。


16

C ++には、TR1以降、組み込みの正規表現ライブラリがあります。AFAIK Boostのregexライブラリは非常に互換性があり、標準ライブラリがTR1を提供していない場合は、代替として使用できます。


どのコンパイラーにTR1がありますか?私のg ++​​ 4.1.2(Debian Etch)は#include <regex>をサポートしていませんが、TR1に注目してくれてありがとう、忘れていました。TR1およびC ++ 0xの上でより多く知りたい他の人は、以下を参照してくださいen.wikipedia.org/wiki/Technical_Report_1
ステファン

SP1の時点で、Visual Studio 2008には正規表現を含むほとんどのTR1があります。Linuxではそれが役に立たないことは知っていますが、他の人が興味を持っているかもしれません。Dinkumwareは、gccでTR1もサポートしています。
マイケルバー

私はあなたのstdライブラリが正規表現を持っていない場合、その後、あなたはブーストを使用することができ、書いたように:boost.org/doc/libs/1_36_0/doc/html/boost_tr1/...
Kasprzol

3
g ++ 4.5.0。TR1はtr1 / regexに住んでいます。例:#include <tr1 / regex>
Ogre Psalm33

11

さらに2つのオプション:

c ++ 11で記述できる場合-チュートリアルを実行します:http : //www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

注:現時点では、動作することがわかっている唯一のc ++ 11正規表現ライブラリはclang / llvmであり、Macでのみ動作します。GNUはまだ正規表現を実装しいません。Visual Studioについては知りません。ほとんどの人はまだブースト正規表現の実装を使用しています。


または、ragelを使用して有限状態マシンを生成し、解析を実行して、C / C ++コード実装を生成することもできます。http//www.complang.org/ragel/

私はそれを少し使用して、jsonを解析するためのコードを生成しました。このragelファイル:https : //github.com/matiu2/yajp/blob/master/parser/number.rl は、このコードを生成するために使用されます https://github.com/matiu2/yajp/blob/master/parser/json .hpp#L254 とこの有限状態マシン図:

状態図


更新1:

lvmのlibc ++正規表現はubuntu 14.04で動作します:libc ++-dev-LLVM C ++標準ライブラリ(開発ファイル)。コンパイル時:clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

アップデート2:

私は現在、ブーストスピリット3を楽しんでいます。BNFスタイルのルールがあり、よく考えられているため、正規表現よりも気に入っています。(古い(もっと文書化された)Spirit Qi libs はここにあります




6

私は常にboost.regexを使用してきました(ただし、C ++では正規表現の必要性はあまりありません)。Microsoft LabsにもGRETAと呼ばれる正規表現ライブラリがあります:http ://research.microsoft.com/projects/greta/ 。どうやらそれは非常に高速で、Perl 5の構文全体を備えています。まだ使用していませんが、テストしてみてください。


8
GRETA(research.microsoft.com/en-us/downloads/…)は、エリックニーブラーがマイクロソフトで働いたときに(GRETAのヘッダーファイルから1998-2001)作成されました。エリックニーブラーは、2007年にBoost.Xpressiveを発表しました。Boost.Xpressiveは「Microsoft Researchエンドユーザーライセンス契約」よりも新しく、優れたライセンスを持っているため、人々はBoost.Xpressiveを使用する必要があります
Cristian Adam

1
申し訳ありませんが、Boostライブラリをプルするのが良いことだとは思いません。ブーストのローカルダウンロード非圧縮バージョンを最後に確認したのは400メガバイトです。ブーストで得られるイナインテンプレートの狂気は言うまでもありません。申し訳ありませんが、グレッグスの回答をお勧めします。
チャド


@Chad boostはよく知られており、多くの状況で役立つ標準ライブラリのセットとしてよく知られているためですか?ダウンロードサイズが大きすぎる場合は、BCDを使用して不要なものを削除します。この方法で削除すると、boost.regexは非常に小さくなります。
アリス


1

ここでは、C ++ 0xに付属するものについては何も述べていません。コンパイラとC ++ 0xをサポートするSTLを使用している場合は、プロジェクトに別のlibを使用する代わりに、それを使用できます。


1
投票数が最も多い回答(2年以上前)を見ると、これについて言及されています。
Mateen Ulhaq、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.