【问题标题】:C++: what regex library should I use? [closed]C++:我应该使用什么正则表达式库? [关闭]
【发布时间】:2010-09-15 22:44:50
【问题描述】:

我正在开发一个在基于 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,因此不能用于这个项目)

【问题讨论】:

  • 如果有人正在查看这个老问题以寻求提示……最近出现了一个值得一提的新库:Google 的 RE2:code.google.com/p/re2
  • This 是新的 PCRE2(PCRE 的修订版)库的 c++ 包装器。

标签: c++ regex linux


【解决方案1】:

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

就我个人而言,我发现Boost.Xpressive 更适合使用。它是一个仅包含头文件的库,并且具有一些不错的功能,例如静态正则表达式(在编译时编译的正则表达式)。

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

【讨论】:

  • Boost 充满了错误,而且似乎缺乏编码标准和 QA 流程。它并不真正适合生产软件。这包括它的 Regex 工具,它在一些地方使用 C(而不是 C++),并且包括由于 sprintf 等不安全函数而导致的缓冲区溢出。当我在审计后报告了一堆错误时,在报告后几个月它们仍然“未被承认”。使用风险自负。
  • 将近 5 年后,我今天尝试使用 std::regex,但事实证明它尚未在 GCC 中实现。见stackoverflow.com/questions/15671536/…
  • 不使用 std::regex 或 boost::regex 的充分理由是 boost::regex 比 re2 慢 10 倍左右
  • @jww 不,C++ 标准(C++03 TR、C++11 和 C++1y)已决定 incorporate several boost libraries into the standard。这意味着,出于所有实际目的,Boost 制定标准。在没有证据的情况下使用诸如“可能”之类的狡猾词和使用人身攻击来做出断言并不能改变现在大部分的 boost 都是 C++ 的事实,而且许多定义 C++ 的现代方向的人也在致力于 boost。
  • @Alice - C 和 C++ 委员会创建标准。它们不包含库。我不知道他们曾经制作过图书馆。
【解决方案2】:

感谢所有建议。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 什么编译器有TR1?我的 g++ 4.1.2 (Debian Etch) 副本不支持 #include 但感谢您让我注意到 TR1,我忘记了。对于其他想了解更多关于 TR1 和 C++0x 的信息,请参阅en.wikipedia.org/wiki/Technical_Report_1
      • 从 SP1 开始,Visual Studio 2008 具有 TR1 的大部分内容,包括正则表达式。我知道它在 Linux 上对您没有帮助,但其他人可能会感兴趣。 Dinkumware 还支持 gcc 上的 TR1。
      • 正如我所写,如果您的标准库没有正则表达式,那么您可以使用 boost:boost.org/doc/libs/1_36_0/doc/html/boost_tr1/…
      • g++ 4.5.0。 TR1 存在于 tr1/regex 中。例如:#include
      【解决方案5】:

      另外两个选项:

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


      更新 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 库found here

      【讨论】:

        【解决方案6】:

        Boost 中有regex

        这应该可以弥补

        【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          我个人一直使用 boost.regex(虽然我在 C++ 中对 regex 的需求不大)。 Microsoft Labs 也有一个正则表达式库,称为 GRETA:http://research.microsoft.com/projects/greta/。显然它非常快并且具有完整的 Perl 5 语法。我没用过,你可以试试看。

          【讨论】:

          • GRETA (research.microsoft.com/en-us/downloads/…) 由 Eric Niebler 在 Microsoft 工作时制作(1998-2001 来自 GRETA 的头文件)。 Eric Niebler 随后在 2007 年制作了 Boost.Xpressive。人们应该使用 Boost.Xpressive,因为它比“Microsoft Research 最终用户许可协议”更新且具有更好的许可
          • 抱歉,我看不出引入 Boost 库是件好事。上次查看本地下载未压缩版本的 boost 是 400 兆。更不用说你通过 boost 获得的 inain 模板疯狂了。抱歉,我建议 Gregs 回答。
          • @Chad 因为 boost 是一套众所周知且备受推崇的标准库,在许多情况下都有用?如果下载大小对您来说太大,只需使用 BCD 删除您不需要的任何内容;以这种方式剥离时, boost.regex 非常小。
          【解决方案9】:

          我遇到了类似的情况,最终使用了 Henry Spences 正则表达式引擎 http://www.codeproject.com/KB/string/spencerregexp.aspx

          【讨论】:

            【解决方案10】:

            这里没有人谈论 C++0x 附带的那个。 如果您使用的是支持 C++0x 的编译器和 STL,则可以直接使用它,而不是在项目中使用另一个库。

            【讨论】:

            • 如果您查看投票率最高的答案(从 2 年前开始),它会提到这一点。
            猜你喜欢
            • 1970-01-01
            • 2018-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-16
            相关资源
            最近更新 更多