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