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
斯特凡2010年

2
是新PCRE2(PCRE的修订版)库的c ++包装。
Jahid

Answers:


80

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

我个人认为Boost.Xpressive更好用。它是仅标头的库,并且具有一些不错的功能,例如静态正则表达式(在编译时编译的正则表达式)。

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


4
Boost充满了错误,并且似乎缺乏编码标准和质量检查流程。它并不真正适合生产软件。其中包括其Regex齿轮,该齿轮在某些地方使用C(而不是C ++),并且由于不安全的功能(例如sprintf)而导致缓冲区溢出。当我在审核后报告一堆错误时,在报告发布几个月后,这些错误仍然“未被确认”。使用风险自负。
jww 2012年

8
大约5年后,我今天尝试使用std :: regex,但事实证明它尚未在GCC中实现。见stackoverflow.com/questions/15671536/...
斯特凡

2
不使用std :: regex或boost :: regex的充分理由就是boost :: regex比re2慢10倍
Arsen Zahray 2013年

3
@jww不,C ++标准(C ++ 03 TR,C ++ 11和C ++ 1y)已决定将多个Boost库合并到该标准中。这意味着,出于所有实际目的,Boost 制定了标准。使用诸如“可能”之类的狡猾的词进行断言而没有证据,并且使用人身攻击也无济于事,不能改变这样的事实,即boost的大部分现在都是C ++,许多定义C ++现代方向的人也在努力进行boost。
爱丽丝

3
@Alice-C和C ++委员会创建标准。他们没有合并库。我不知道他们曾经生产过图书馆。
2014年

22

感谢所有的建议。

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


19

在过去的C ++项目中,我使用PCRE取得了成功。它已在许多知名项目中使用,因此非常完整且经过了测试。而且我看到Google最近也为PCRE提供了一组C ++包装器。


16

自TR1以来,C ++具有内置的正则表达式库。AFAIK Boost的正则表达式库与它非常兼容,如果您的标准库不提供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。
Michael Burr

如我所写,如果您的标准库没有正则表达式,则可以使用boost: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

还有两个选择:

如果您可以用c ++ 11编写它-请执行本教程:http : //www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

注意:在编写本文时,我知道唯一可用的 c ++ 11 regex库是clang / llvm one,并且仅在Mac上可用。GNU仍未实现正则表达式。我不了解Visual Studio。大多数人仍然使用boost regex实现。


或者您可以使用雷杰尔生成有限状态机来为您进行解析,并生成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:

我目前正在享受Boost Spirit 3-我比regex更喜欢它,因为它具有BNF样式规则并且经过深思熟虑。(在此处找到较旧的(更多文献)Spirit Qi libs )




6

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


8
GRETA(research.microsoft.com/en-us/downloads/…)由Eric Niebler在Microsoft工作时(1998-2001年来自GRETA的头文件)制成。埃里克·尼伯勒(Eric Niebler)随后在2007年制作了Boost.Xpressive。人们应该使用Boost.Xpressive,因为它是新的,并具有比“微软研究院最终用户许可协议”一个更好的牌
克里斯蒂安·亚当

1
抱歉,我看不到将Boost库拉入是多么好。我上次检查boost的本地下载未压缩版本是400兆。更不用说您因提升而获得的原始模板疯狂。抱歉,我建议格雷格斯回答。
乍得


@Chad因为boost是众所周知的标准库集,在许多情况下都有用?如果下载大小对于您来说太大,则只需使用BCD剥离不需要的任何内容即可;以这种方式剥离时,boost.regex很小。
爱丽丝


1

这里没有人对C ++ 0x附带的内容发表任何看法。如果使用的是支持C ++ 0x的编译器和STL,则可以使用它而不是在项目中包含另一个lib。


1
如果您查看投票最高的答案(超过2年前),就会提到这一点。
Mateen Ulhaq 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.