免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: fwizard
打印 上一主题 下一主题

[C] 如何在C语言中巧用正则表达式 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
21 [报告]
发表于 2008-01-01 14:02 |只看该作者
pcre 很强大,很邪恶。

论坛徽章:
0
22 [报告]
发表于 2008-01-01 16:26 |只看该作者
我也顶一下!!!一向以为C没有正则,看到楼主的文章,才知道有!

论坛徽章:
0
23 [报告]
发表于 2008-01-02 08:48 |只看该作者
感谢分享,哪儿有开源的库就好了,什么环境下都可用。

论坛徽章:
0
24 [报告]
发表于 2008-01-02 09:51 |只看该作者
pcre_compile
pcre_exec

这两个也能实现

论坛徽章:
0
25 [报告]
发表于 2008-01-02 10:59 |只看该作者
谢楼主,这个牛啊!

论坛徽章:
0
26 [报告]
发表于 2009-06-26 14:10 |只看该作者
运行了下楼主的程序,怎么是:Segmentation fault
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
/* 取子串的函数 */
static char* substr(const char*str, unsigned start, unsigned end)
{
&nbsp;&nbsp;&nbsp;&nbsp;unsigned n = end - start;
&nbsp;&nbsp;&nbsp;&nbsp;static char stbuf[256];
&nbsp;&nbsp;&nbsp;&nbsp;strncpy(stbuf, str + start, n);
&nbsp;&nbsp;&nbsp;&nbsp;stbuf[n] = 0;
&nbsp;&nbsp;&nbsp;&nbsp;return stbuf;
}
/* 主程序 */
int main(int argc, char** argv)
{
&nbsp;&nbsp;&nbsp;&nbsp;char * pattern;
&nbsp;&nbsp;&nbsp;&nbsp;int x, z, lno = 0, cflags = 0;
&nbsp;&nbsp;&nbsp;&nbsp;char ebuf[128], lbuf[256];
&nbsp;&nbsp;&nbsp;&nbsp;regex_t reg;
&nbsp;&nbsp;&nbsp;&nbsp;regmatch_t pm[10];
&nbsp;&nbsp;&nbsp;&nbsp;const size_t nmatch = 10;
&nbsp;&nbsp;&nbsp;&nbsp;/* 编译正则表达式*/
&nbsp;&nbsp;&nbsp;&nbsp;pattern = argv[1];
&nbsp;&nbsp;&nbsp;&nbsp;z = regcomp(&reg, pattern, cflags);
&nbsp;&nbsp;&nbsp;&nbsp;if (z != 0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regerror(z, &reg, ebuf, sizeof(ebuf));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, "%s: pattern '%s' \n", ebuf, pattern);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;/*  逐行处理输入的数据 */
&nbsp;&nbsp;&nbsp;&nbsp;while(fgets(lbuf, sizeof(lbuf), stdin)) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++lno;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((z = strlen(lbuf)) >0 && lbuf[z-1] == '\n')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lbuf[z - 1] = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* 对每一行应用正则表达式进行匹配 */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z = regexec(&reg, lbuf, nmatch, pm, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (z == REG_NOMATCH) continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (z != 0) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regerror(z, &reg, ebuf, sizeof(ebuf));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, "%s: regcom('%s')\n", ebuf, lbuf);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* 输出处理结果 */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (x = 0; x < nmatch && pm[x].rm_so != -1; ++ x) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!x) printf("%04d: %s\n", lno, lbuf);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("  $%d='%s'\n", x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;/* 释放正则表达式  */
&nbsp;&nbsp;&nbsp;&nbsp;regfree(&reg);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
27 [报告]
发表于 2009-06-26 14:14 |只看该作者
真的很不错。

论坛徽章:
0
28 [报告]
发表于 2009-06-26 14:15 |只看该作者

回复 #27 wrongch 的帖子

啥很不错啊??

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:03
29 [报告]
发表于 2009-06-27 07:15 |只看该作者
我运行也 Segmentation fault

论坛徽章:
80
20周年集字徽章-庆
日期:2020-10-28 14:09:1215-16赛季CBA联赛之北京
日期:2020-10-28 13:32:5315-16赛季CBA联赛之北控
日期:2020-10-28 13:32:4815-16赛季CBA联赛之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
30 [报告]
发表于 2009-07-03 08:49 |只看该作者
牛人。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP