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

110

我正在开发一款商业(非开源)的C ++项目,该项目运行在基于Linux的系统上。我需要在C ++代码中进行一些正则表达式操作。(我知道:我现在有两个问题。)

问题:那些经常使用C / C ++进行正则表达式操作的人推荐我查看哪些库?快速搜索引起了我以下的注意:

1)Boost.Regex(我需要去阅读Boost软件许可证,但这个问题不涉及软件许可证)

2)C(而非C ++)POSIX regex(#include <regex.h>, regcomp,regexec等)

3)http://freshmeat.net/projects/cpp_regex/(我对此一无所知;似乎使用GPL,因此不能在此项目中使用)


21
如果有人正在查看这个旧问题以获得提示……最近出现了一个值得一提的新库:Google的RE2:http://code.google.com/p/re2/。 - Stéphane
3
这个 是 PCRE2(PCRE的修订版本)库的 C++ 包装器。 - Jahid
10个回答

82

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

个人认为Boost.Xpressive更加易于使用,它是一个仅需头文件即可使用的库,并具有一些不错的功能,例如静态正则表达式(在编译时就已经编译好了的正则表达式)。

更新:如果您正在使用符合C++11标准的编译器(gcc 4.8不行!),请使用std::regex,除非您有很好的理由使用其他东西。


5
Boost充满了错误,并且似乎缺乏编码标准和质量保证流程。它不太适合生产软件。这包括其正则表达式引擎,其中某些部分使用C(而非C ++),并且由于不安全的函数(例如sprintf)而包含缓冲区溢出。在我进行审核后报告了一堆错误后,它们仍然“未被确认”,数月后才得到回应。使用时需自行承担风险。 - jww
8
今天我尝试使用 std::regex,但发现它在 GCC 中还没有被实现,跳转至 https://dev59.com/v3DXa4cB1Zd3GeqP9zhL。五年过去了才尝试使用,却无法使用。 - Stéphane
3
@jww 你的评论有些荒谬。sprintf并不一定会导致缓冲区溢出;完全有可能使用它而不发生这种情况,与(例如)gets不同。此外,boost并非“充满漏洞”;虽然偶尔会出现一些问题(如其更改日志所示),但这并不比其他大型项目更多。至于缺乏编码标准或QA流程,那是明显错误的,只需简单的谷歌搜索即可证明。考虑到boost已经被吸收到标准中,我认为你的评论不仅不真实,而且是明显错误的。 - Alice
4
不,C++标准(包括C++03 TR、C++11和C++1y)已决定将多个boost库融入标准中。这意味着,在实际应用中,Boost构成了标准的一部分。使用没有证据支持的断言,如“可能”,并进行人身攻击,都不能改变这样一个事实:Boost的很多重要部分现在都是C++标准的一部分,许多定义C++现代方向的人也在参与Boost的开发。 - Alice
3
@jww 除了他们做了 - Alice
显示剩余9条评论

24

感谢所有的建议。

今天我试用了几种方法,在我们需要做的事情中,我选择了最简单的解决方案,不需要下载任何其他第三方库。最终,我使用标准的C POSIX调用regcomp()和regexec(),并包含了<regex.h>库。虽然不是C++,但在紧急情况下,这被证明是最容易的方法。


20

在我过去的C++项目中,我曾经使用过PCRE,并且取得了很好的成功。它非常完整且经过充分测试,因为它被用于许多高知名度的项目中。而且,我最近也看到Google贡献了一组PCRE的C++封装。


16

C++自TR1版本开始内置支持正则表达式库。据我所知,Boost的正则表达式库与其非常兼容,如果你的标准库不提供TR1,则可以将其用作替代品。


什么编译器有TR1?我的g++ 4.1.2(Debian Etch)副本不支持#include <regex>,但感谢您提醒我注意TR1,我已经忘记了。对于其他想要了解TR1和C++0x的人,请参见http://en.wikipedia.org/wiki/Technical_Report_1。 - Stéphane
截至SP1,Visual Studio 2008已经包含了大部分TR1,包括正则表达式。我知道这对于Linux用户没有帮助,但其他人可能会感兴趣。Dinkumware也支持在gcc上使用TR1。 - Michael Burr
正如我所写的,如果你的std库没有正则表达式,那么你可以使用boost:http://www.boost.org/doc/libs/1_36_0/doc/html/boost_tr1/subject_list.html#boost_tr1.subject_list.regex - Kasprzol
3
g++ 4.5.0中的TR1位于tr1/regex文件夹中。例如:#include <tr1/regex>。这段话的意思是,TR1(即Technical Report 1)是C++标准库的扩展部分,在g++ 4.5.0版本中,TR1的正则表达式库被放置在tr1/regex文件夹中,如果需要使用TR1的正则表达式库,则应该包含<tr1/regex>头文件。 - Ogre Psalm33

11

还有两个选择:

如果你能在c++11中编写代码-完成这个教程:http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

注意:撰写本文时我所知道的唯一可用的c++11正则表达式库是clang/llvm,而且仅适用于Mac。GNU仍未实现正则表达式。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 3,我比正则表达式更喜欢它,因为它有BNF风格的规则并且思路清晰。(旧版本(更详细的)Spirit Qi libs 点击此处查看


11

似乎比Google的Re2慢。http://lh3lh3.users.sourceforge.net/reb.shtml - Chad

7

6

我个人一直使用boost.regex(虽然我在C++中没有太多需要使用正则表达式)。Microsoft Labs也有一个名为GRETA的正则表达式库:http://research.microsoft.com/projects/greta/。据说它非常快,并且支持整个Perl 5语法。我没有使用过,但你可能想测试一下。


8
GRETA是由Eric Niebler在微软工作期间(1998-2001,根据GRETA的头文件)开发的。之后,Eric Niebler在2007年开发了Boost.Xpressive。人们应该使用Boost.Xpressive,因为它更加新颖,并且具有比"Microsoft Research end user license agreement"更好的许可证。 - Cristian Adam
1
抱歉,我不认为引入Boost库是一个好主意。上次我检查本地未压缩版本的Boost大小为400兆字节。更不用说使用Boost时会遇到的疯狂模板问题了。抱歉,我建议采纳格雷格的答案。 - Chad
http://lh3lh3.users.sourceforge.net/reb.shtml - Chad
1
@Chad 因为 Boost 是一组广为人知且备受推崇的标准库,可在许多情况下提供帮助。如果下载大小对您来说太大,只需使用 BCD 剥离掉您不需要的内容;使用这种方式剥离后,boost.regex 的大小相当小。 - Alice

4

1

这里没有人提到C++0x带的那个库。 如果你正在使用支持C++0x的编译器和STL,你可以直接使用它,而不必在你的项目中添加另一个库。


1
如果您查看最高投票的答案(来自2年前),它会提到这一点。 - Mateen Ulhaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接