当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C++:我应该使用什么正则表达式库?》经验,为你挑选了8个好方法。

我正在开发一个在基于linux的系统上运行的商业(非开源)C++项目.我需要在C++代码中做一些正则表达式.(我知道:我现在有2个问题.)

问题:经常从C/C++开始使用正则表达式的人建议我查看哪些库?快速搜索引起了我的注意:

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

2)C(不是C++)POSIX正则表达式(#include ,regcomp,regexec等)

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



1> Ferruccio..:

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

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

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


大约5年后,我今天尝试使用std :: regex,但事实证明它还没有在GCC中实现.请参阅http://stackoverflow.com/questions/15671536/why-does-this-c11-stdregex-example-throw-a-regex-error-exception
Boost充满了漏洞,似乎缺乏编码标准和QA流程.它不太适合生产软件.其中包括Regex齿轮,它在某些地方使用C(而不是C++),并且由于sprintf等不安全的功能而包含缓冲区溢出.当我在审计后报告了一堆错误时,他们在报告后几个月仍然"未得到承认".使用风险由您自己承担.
@jww不,C++标准(C++ 03 TR,C++ 11和C++ 1y)决定[将几个boost库纳入标准](http://www.open-std.org/jtc1 /sc22/wg21/docs/library_technical_report.html).这意味着,出于所有实际目的,Boost*制定了*标准.使用像"可能"这样的狡猾的词语并使用人工攻击来做出没有证据的断言并没有改变大部分提升现在是C++的事实,并且许多定义C++现代方向的人也在努力提升.
那个没有使用std :: regex或boost :: regex的好理由就是boost :: regex比re2慢大约10倍
@jww您的评论很愚蠢。sprintf不一定要求缓冲区溢出;完全有可能使用它,而不会发生任何事情,这与(例如)获取不同。同样,boost也不是“充满bug”。尽管偶尔会有一个这样的项目(如其变更日志所示),但这只不过是任何其他大型项目。至于缺乏编码标准或质量检查流程,这完全是错误的,就像一个简单的Google搜索所显示的那样。鉴于提振已被纳入标准本身,我建议您的评论不仅是不真实的,而且绝对是这样。
@Alice - C和C++委员会创建标准.他们没有合并图书馆.我不知道他们生产过图书馆.
@jww [他们除外](http://www.open-std.org/jtc1/sc22/wg21/docs/library_technical_report.html)
@jww [我现在已经有三次了](http://www.open-std.org/jtc1/sc22/wg21/docs/library_technical_report.html)

2> Stéphane..:

感谢所有的建议.

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



3> Greg Hewgill..:

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



4> 小智..:

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


g ++ 4.5.0.TR1生活在tr1/regex中.例如:#include

5> matiu..:

还有两个选择:

如果你可以用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 和这个有限状态机图:

状态图


更新1:

lvm的libc ++ regex适用于ubuntu 14.04:libc ++ - dev - LLVM C++标准库(开发文件).编译时:clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

更新2:

我目前正在享受提升精神3 - 我比正则表达更喜欢它,因为它具有BNF风格规则并且经过深思熟虑.(旧的(记录更多)Spirit Qi libs 在这里找到)



6> Robert Gould..:

Boost有正则表达式.

这应该填补这个法案



7> Alexander Go..:

您还可以查看Yandex搜索引擎开发的快速正则表达式库,以便针对大量数据快速匹配数千种模式.



8> Roel..:

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


GRETA(http://research.microsoft.com/en-us/downloads/bd99f343-4ff4-4041-8293-34c054efe749/default.aspx)由Eric Niebler在Microsoft工作时制作(1998-2001来自GRETA的头文件) ).Eric Niebler于2007年制作了Boost.Xpressive.人们应该使用Boost.Xpressive,因为它比"Microsoft Research最终用户许可协议"更新,并且拥有更好的许可证
推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有