C ++:我应该使用什么正则表达式库?

时间:2008-10-08 07:10:52

标签: c++ regex linux

我正在开发一个在基于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,因此无法在此项目中使用)

10 个答案:

答案 0 :(得分:79)

Boost.Regex非常好,并且有望成为C ++ 0x标准的一部分(它已经在TR1中)。

就个人而言,我发现Boost.Xpressive可以更好地使用。它是一个只有头的库,它有一些很好的功能,比如静态正则表达式(在编译时编译的正则表达式)。

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

答案 1 :(得分:21)

感谢所有建议。

我今天尝试了一些东西,并且考虑到我们尝试做的事情,我选择了最简单的解决方案,我无需下载任何其他第三方库。最后,我#include< regex.h>并使用标准的C POSIX调用regcomp()和regexec()。不是C ++,但是在这个问题上,这被证明是最简单的。

答案 2 :(得分:18)

在过去的C ++项目中,我使用PCRE取得了很好的成功。它非常完整且经过充分测试,因为它被用于许多高端项目中。我发现Google最近也为PCRE贡献了一套C ++包装器。

答案 3 :(得分:15)

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

答案 4 :(得分:10)

还有两个选择:

如果您可以在 c ++ 11 中编写它 - 请参阅教程:http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

注意: 在撰写本文时,我所知道的唯一的c ++ 11正则表达式库是clang/llvm one,并且仅适用于Mac。 GNU仍然是doesn't implement regex yet。我不了解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 ++ regex适用于ubuntu 14.04:libc ++ - dev - LLVM C ++标准库(开发文件)。编译时:clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

更新2:

我目前正在享受 boost spirit 3 - 我比正则表达式更喜欢它,因为它具有BNF样式规则并且经过深思熟虑。 (旧的(更多文件)Spirit Qi libs found here

答案 5 :(得分:9)

Boost中有regex

那应该填写账单

答案 6 :(得分:6)

您还可以查看fast regex library搜索引擎开发的Yandex,以便针对大量数据快速匹配数千种模式。

答案 7 :(得分:5)

我个人总是使用boost.regex(尽管我对C ++中的regex并不太需要)。 Microsoft Labs也有一个名为GRETA的正则表达式库:http://research.microsoft.com/projects/greta/。显然它非常快,并且具有完整的Perl 5语法。我没有用它,但你可能想测试它。

答案 8 :(得分:3)

我遇到了类似的情况,最终使用了Henry Spencers Regexp Engine http://www.codeproject.com/KB/string/spencerregexp.aspx

答案 9 :(得分:1)

这里没有人说过C ++ 0x附带的内容。 如果您使用的是编译器和支持C ++ 0x的STL,您可以使用它而不是在项目中使用另一个lib。