六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 29|回复: 0

C/C++正则表达式编程

[复制链接]

升级  56.05%

691

主题

691

主题

691

主题

探花

Rank: 6Rank: 6

积分
2121
 楼主| 发表于 2013-1-26 14:01:01 | 显示全部楼层 |阅读模式
refer: http://old.blog.edu.cn/user2/linxh/archives/2006/1438032.shtml
原文转自: http://www.devfront.com:8080/?q=node/140
GNU/Linux有两套库可用于正则表达式编程:POSIX库和PCRE库。前者不需要单独安装,一般需求还是能满足的,速度稍慢些。后者是久负盛名的Perl正则表达式库,功能强大,匹配速度快,不过可能需要单独安装。
我们先用一个例子来介绍如何使用POSIX库。
<div style="border: 1px solid #cccccc; margin: 5px 20px; padding: 5px;">#i nclude <stdio.h>
#i nclude <sys/types.h>
#i nclude <regex.h>
char *get_regerror (int errcode, regex_t *compiled)
{
size_t length = regerror (errcode, compiled, NULL, 0);
char *buffer = malloc(length);
if (!buffer) return NULL;
(void) regerror (errcode, compiled, buffer, length);
return buffer;
}
int regtest(const char*pattern, const char* string)
{
regex_t reg;
regmatch_t *subexprs = NULL;
int ret;
int i;
if (0 != (ret=regcomp(?, pattern, REG_EXTENDED))) {
char *buffer = get_regerror(ret, ?);
if (buffer) {
fprintf(stderr, "regcomp:[%d]%s\n", ret, buffer);
free(buffer);
}
return -1;
}
subexprs = malloc((reg.re_nsub+1)*sizeof(regmatch_t));
if (!subexprs) {
fprintf(stderr, "error malloc subexprs\n");
regfree(?);
return -1;
}
if (0 != (ret=regexec(?, string, reg.re_nsub+1, subexprs, 0))) {
char *buffer = get_regerror(ret, ?);
if (buffer) {
fprintf(stderr, "regexec:[%d]%s\n", ret, buffer);
free(buffer);
}

regfree(?);
return -1;
}
for (i = 0; i <= reg.re_nsub; i++) {
printf("[%d]:", i);

if (subexprs.rm_so == subexprs.rm_eo) {
printf("[EMPTY SUBEXPR]\n");
}
else if (subexprs.rm_so == -1 ||
subexprs.rm_eo == -1) {
printf("[NO SUBEXPR]\n");
}
else {
fwrite(string+subexprs.rm_so, 1,
subexprs.rm_eo-subexprs.rm_so, stdout);
printf("\n");
}
}
regfree(?);
if (subexprs) free(subexprs);
return 0;
}
int main(int argc, char *argv[])
{
if (argc != 3) {
fprintf(stderr, "Usage: regtest pattern string\n");
return -1;
}
fprintf(stderr, "pattern:%s\n", argv[1]);
fprintf(stderr, "string:%s\n", argv[2]);
return regtest(argv[1], argv[2]);
}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表