web-dev-qa-db-ja.com

C ++:どの正規表現ライブラリを使用すればよいですか?

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

質問:C/C++から正規表現を定期的に実行する人は、どのライブラリを検討することをお勧めしますか?クイック検索により、次のことがわかりました。

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

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

3) http://freshmeat.net/projects/cpp_regex/ (これについては何も知らない。GPLのようであるため、このプロジェクトでは使用できない)

106
Stéphane

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

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

22
Stéphane

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

個人的には、 Boost.Xpressive の方がはるかに優れていると思います。これはヘッダーのみのライブラリであり、静的正規表現(コンパイル時にコンパイルされる正規表現)などのいくつかの素晴らしい機能があります。

更新:C++ 11準拠のコンパイラを使用している場合(gcc 4.8はそうではありません!)、 stdを使用します。 :regex 他の何かを使用する正当な理由がない限り。

80
Ferruccio

過去のC++プロジェクトでは、 [〜#〜] pcre [〜#〜] を使用して成功しました。多くの有名なプロジェクトで使用されているため、非常に完全で十分にテストされています。また、Googleは最近、PCREのC++ラッパーセットも提供していることがわかります。

19
Greg Hewgill

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

16
Kasprzol

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

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

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


または、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 およびこの有限状態マシン図:

state diagram


更新1:

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

更新2:

私は現在楽しんでいますboost spirit-正規表現よりも好きです。考え抜いた。 (以前の(詳細な文書化)Spirit Qi libs ここにあります

11
matiu

Boostには regex が含まれています。

それは法案を埋める必要があります

10
Robert Gould

また、 Yandex で開発された fast regex library を見ることができます。これは、膨大な量のデータに対して何千ものパターンの高速一致を行うためのものです。

7

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

6
Roel

私は同様の状況に直面し、Henry Spencers Regexp Engineを使用しました http://www.codeproject.com/KB/string/spencerregexp.aspx

4
MartinKahn

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

2
RedX