【问题标题】:Grep-like filter in C?C中的类似Grep的过滤器?
【发布时间】:2011-12-14 14:41:53
【问题描述】:

有没有什么简单的方法可以用正则表达式过滤掉C语言中的字符串?

以下是调用此类函数 re(regexp,str,outstr) 的示例:

printf("%s\n", re("G*o", "Geraldo Gerardo German", outstr));

并将用“Geraldo Gerardo”填充outstr

在 C 中最合适的方法是什么?编写我自己的函数或使用现有的函数(希望,多平台,所以 ANSI 或任何可移植的标准库更可取)。

【问题讨论】:

标签: c regex


【解决方案1】:

在 POSIX 世界中,#include <regex.h> 应该引导您到 standard POSIX regex library

【讨论】:

  • +1 对于非大锤方法。 PCRE 的反向引用很好,但排除了 NFA 或 DFA 匹配算法,如 swtch.com/~rsc/regexp/regexp1.html 所述
  • @Dave 缺点是 POSIX 不可移植
  • @DavidHeffernan 如果你想在 Windows 上部署,有Regex for Windowsregex.h 的直接端口到 Windows。否则,posix 几乎无处不在。
【解决方案2】:

如果您想要可移植性,那么您应该使用用可移植 C 编写的正则表达式库。例如 PCRE。 C 标准库中不支持正则表达式,因此您必须查看它之外的内容。

【讨论】:

    【解决方案3】:

    您可以使用 PCREre2 之类的东西(后者需要 C 包装器)。但是,我不知道直接在printf 中使用这样的函数的输出是个好主意。如果没有匹配怎么办? (而且您的正则表达式与该字符串不匹配。您的意思可能是"G.*o"

    【讨论】:

      【解决方案4】:

      正则表达式 不是任何 ANSI C 的一部分,因此您需要依赖一些 3rd 方库。

      这里有两个,我推荐 PCRE:

      1. Regular Expressions - The GNU C Library
      2. PCRE - Perl Compatible Regular Expressions

      【讨论】:

        【解决方案5】:

        您可以围绕 Boost.Regex 编写 C 包装器:
        http://www.boost.org/doc/libs/1_36_0/libs/regex/doc/html/index.html

        【讨论】:

          猜你喜欢
          • 2012-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-02
          • 2013-11-17
          相关资源
          最近更新 更多