C ++:我应该使用哪个正则expression式库?

我正在开发一个基于Linux的系统上运行的商业(而不是开源)C ++项目。 我需要在C ++代码中做一些正则expression式。 (我知道:我现在有两个问题。)

问题:经常从C / C ++推荐正则expression式的人使用哪些库? 快速search引起了我的注意:

1)Boost.Regex(我需要阅读Boost软件许可证,但这个问题不是关于软件许可证)

2)C(不是C ++)POSIX正则expression式(#include <regex.h>,regcomp,regexec等)

3) http://freshmeat.net/projects/cpp_regex/ (我对此一无所知;似乎是GPL,因此在这个项目上不可用)

Boost.Regex非常好,将被定为C ++ 0x标准的一部分(它已经在TR1中)。

就我个人而言,我觉得Boost.Xpressive更好用。 它是一个只有头文件的库,它有一些很好的function,例如静态正则expression式(在编译时编译的正则expression式)。

更新:如果您使用的是C ++ 11兼容编译器(gcc 4.8不是!),请使用std :: regex,除非您有充分理由使用其他内容。

感谢所有的build议。

今天我尝试了一些东西,而且我们正在尝试做的东西,我select了最简单的解决scheme,我不必下载任何其他第三方库。 最后,我#include <regex.h>并使用标准的C POSIX调用regcomp()和regexec()。 不是C ++,但在一个捏,这certificate是最简单的。

在过去的C ++项目中,我用PCRE取得了很好的成功。 因为它被用于许多高调的项目,所以它非常完整并且经过了很好的testing。 而且我看到Google最近也为PCRE贡献了一套C ++包装器。

自TR1以来,C ++有一个内置的正则expression式库。 如果您的标准库不提供TR1,AFAIK Boost的正则expression式库与它非常兼容,可以用作替代品。

还有两个选项:

如果你可以写在C ++ 11 – 做的教程: http : //www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

注意:在编写唯一的c + + 11正则expression式库,我知道工作是clang / llvm之一 ,只能在Mac上工作。 GNU还没有实现正则expression式 。 我不知道Visual Studio。 大多数人仍然使用boost正则expression式实现。


或者你可以使用ragel生成一个有限状态机来为你parsing,并生成C / C ++代码实现: http : //www.complang.org/ragel/

我用它来生成代码来parsingjson。 这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 ++正则expression式在ubuntu 14.04上运行:libc ++ – dev – LLVM C ++标准库(开发文件)。 编译时: clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

更新2:

我目前正在享受精神振奋3 – 我比正则expression式更喜欢它,因为它具有BNF风格的规则,并且经过深思熟虑。 (更老的(更多文档)精神lib 在这里find )

Boost有正则expression式 。

这应该填补这个账单

您也可以查看在Yandexsearch引擎开发的快速正则expression式库 ,以便与大量数据进行数千种模式的快速匹配。

我个人总是使用boost.regex(尽pipe在C ++中我没有太多的正则expression式)。 微软实验室也有一个名为GRETA的正则expression式库: http : //research.microsoft.com/projects/greta/ 。 显然它非常快速,并具有完整的Perl 5语法。 我没有使用它,但你可能想要testing它。

我面临类似的情况,最终使用亨利斯宾塞正则expression式引擎http://www.codeproject.com/KB/string/spencerregexp.aspx

这里没人提到C ++ 0x。 如果您使用的是编译器和支持C ++ 0x的STL,则可以使用该编译器而不是在项目中使用其他库。