c正则表达式howto

时间:2009-10-27 15:07:07

标签: c regex

我看了c已经10年了。我需要在c中编写一个解析字符串的小程序。我想使用正则表达式,因为我已经使用它们多年了,但我不知道如何在c中这样做。我花了早上谷歌搜索,我找不到任何直接的例子(即使用这个库,这是方法)。有人能给我一个简单的例子吗?

谢谢!

4 个答案:

答案 0 :(得分:38)

您可以使用PCRE

  

PCRE库是一组使用与Perl 5相同的语法和语义实现正则表达式模式匹配的函数.PCRE有自己的本机API,以及一组与POSIX正则表达式API对应的包装函数。 PCRE库是免费的,即使是用于构建商业软件。

有关PCRE示例,请参阅pcredemo.c

如果您无法使用PCRE,系统可能会提供POSIX regular expression支持(as @tinkertim pointed out)。对于Windows,您可以使用gnuwin Regex for Windows package

regcomp文档包含以下示例:

#include <regex.h>

/*
 * Match string against the extended regular expression in
 * pattern, treating errors as no match.
 *
 * Return 1 for match, 0 for no match.
 */

int
match(const char *string, char *pattern)
{
    int    status;
    regex_t    re;

    if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
        return(0);      /* Report error. */
    }
    status = regexec(&re, string, (size_t) 0, NULL, 0);
    regfree(&re);
    if (status != 0) {
        return(0);      /* Report error. */
    }
    return(1);
}

答案 1 :(得分:7)

如果只强制进入POSIX(没有pcre),这里有一个回落的小窍门:

#include <regex.h>
#include <stdbool.h>

bool reg_matches(const char *str, const char *pattern)
{
    regex_t re;
    int ret;

    if (regcomp(&re, pattern, REG_EXTENDED) != 0)
        return false;

    ret = regexec(&re, str, (size_t) 0, NULL, 0);
    regfree(&re);

    if (ret == 0)
        return true;

    return false;
}

您可以这样称呼它:

int main(void)
{
   static const char *pattern = "/foo/[0-9]+$";

   /* Going to return 1 always, since pattern wants the last part of the
    * path to be an unsigned integer */
   if (! reg_matches("/foo/abc", pattern))
       return 1;

   return 0;
}

高度建议使用PCRE(如果可用)。但是,很高兴检查它并有一些退步。

我从目前编辑器中的项目中删除了片段。它只是一个非常基本的例子,但是如果需要,它可以为您提供类型和功能。这个答案或多或少地增加了思南的答案。

答案 2 :(得分:0)

除了本机C库之外的另一个选择是使用Python或Perl等其他语言的接口。不必处理C的字符串处理,对正则表达式更好的语言支持应该让事情变得更容易。您还可以使用SWIG之类的工具生成用于从C调用代码的包装器。

答案 3 :(得分:-1)

您还应该查看正则表达式库。它使用正则表达式,例如可以写入Linux Shell的表达式。

有关更多信息,请在Linux下输入 “man regcomp”没有引号