没有合适的资源?快使用搜索试试~ 我知道了~
正则表达式是编程技术中比较复杂的一个,掌握起来相对困难,但在数据检索等到高级编程中又几乎离不开。本文非常详细地介绍了c语言正则表达式的各种用法。
资源推荐
资源详情
资源评论
C 语言正则表达式使用详解
转 年 月 日
标准的 和 都不支持正则表达式,但有正则表达式的函数库提供这功能
语言处理正则表达式常用的函数有 、、和
。
使用正则表达式步骤:
编译正则表达式
匹配正则表达式
释放正则表达式
获取 或者 产生错误,获取包含错误信息的字符串
函数声明如下:
、 !"## $#!
这个函数把指定的正则表达式 # 编译成一种特定的数据格式 参数
,这样可以使匹配更有效。
函数 会使用这个数据在目标文本串中进行模式匹配。执行成功返回0。
参数说明:
%是一个结构体数据类型,用来存放编译后的正则表达式,它的成员
!&'用来存储正则表达式中的子正则表达式的个数,子正则表达式就是用
圆括号包起来的部分表达式。
(#是指向我们写好的正则表达式的指针。
)$#!有如下 个值或者是它们或运算*后的值:
+,-,./,01,1以功能更加强大的扩展正则表达式的方式进行匹配。
+,-234,匹配字母时忽略大小写。
+,-05467不用存储匹配后的结果。
+,-0,8920,识别换行符,这样:;:就可以从行尾开始匹配,:<:就可以从行
的开头开始匹配。
"#! !=#"
#"#">? $#!
当我们编译好正则表达式后,就可以用 匹配我们的目标文本串了,如
果在编译正则表达式的时候没有指定 $#! 的参数为 +,-0,8920,,则默
认情况下是忽略换行符的,也就是把整个文本串当作一个字符串处理。执行成
功返回0。
#"是一个结构体数据类型,在 " 中定义:
[cpp]@AB#@C
1. typedefstruct
2. {
3. regoff_trm_so;
4. regoff_trm_eo;
5. }regmatch_t;
成员 !存放匹配文本串在目标串中的开始位置,存放结束位置。
通常我们以数组的形式定义一组这样的结构。因为往往我们的正则表达式中还
包含子正则表达式。数组 单元存放主正则表达式位置,后边的单元依次存放
子正则表达式位置。
参数说明:
%是已经用 函数编译好的正则表达式。
(!是目标文本串。
)#"是 #" 结构体数组的长度。
D#"#" 类型的结构体数组,存放匹配文本串的位置信息。
E$#!有两个值
+,-05/759 不 匹 配 行 的 开 头 , 除 非 在 编 译 时 $# 设 置
+,-0,8920,。:<:匹配行的开头 不管中是否设置$#!为
+,-05/759。
+,-05/,59 不 匹 配 行 的 结 束 , 除 非 在 编 译 时 $# 设 置
+,-0,8920,。:;:匹配行的末尾 不管中是否设置$#!为
+,-05/,59。
A
当我们使用完编译好的正则表达式后,或者要重新编译其他正则表达式的时候,
我们可以用这个函数清空 指向的 结构体的内容,请记住,
如果是重新编译的话,一定要先清空 结构体。
!= "# '&F
!="
当执行 或者 产生错误的时候,就可以调用这个函数而返回
一个包含错误信息的字符串。
参数说明:
%是由 和函数返回的错误代号。
(是已经用 函数编译好的正则表达式,这个值可以为
0699。
)'&F指向用来存放错误信息的字符串的内存空间。
D"指明 '&F 的长度,如果这个错误信息的长度大于这个值,则
函数会自动截断超出的字符串,但他仍然会返回完整的字符串的长度。
所以我们可以用如下的方法先得到错误字符串的长度。
!="G 0699 H
匹配 ,# 的示例
[cpp]@AB#@C
1. #include<stdio.h>
2. #include<sys/types.h>
3. #include<regex.h>
4.
5. intmain(intargc,char**argv)
6. {
7. intstatus,i;
8. intcflags=REG_EXTENDED;
9. regmatch_tpmatch[1];
10. constsize_tnmatch=1;
11. regex_treg;
12. constchar*pattern="^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*.\\w+
([-.]\\w+)*$";
13. char*buf="chenjiayi@126.com";
14. regcomp(®,pattern,cflags);//编译正则模式
15. status=regexec(®,buf,nmatch,0);//执行正则表达式和缓存的比较
16. if(status==REG_NOMATCH)
17. printf("Nomatch\n");
18. elseif(0==status)
19. {
20. printf("比较成功:");
21. for(i=pmatch[0].rm_so;i<pmatch[0].rm_eo;++i)putchar(buf[i]);
22. printf("\n");
23. }
24. regfree(®);
25. return0;
26. }
正则表达式由一些普通字符和一些元字符(#"##!)组成。普通字
符包括大小写的字母和数字,而元字符则具有特殊的含义。
在最简单的情况下,一个正则表达式看上去就是一个普通的查找串。
例 如 , 正 则 表 达 式 I!I 中 没 有 包 含 任 何 元 字 符 , 它 可 以 匹
配I!I和I!I等字符串,但是不能匹配I/!I。
元字符描述如下:
元字符 描述
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“
匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
^
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^也匹配“\n”或“\r”之后的位置。
$
匹配输入字符串的结束位置。如果设置了 RegExp 对象的 Multiline 属性,$也匹配“\n”或“\r”之前的位置。
*
匹配前面的子表达式零次或多次(大于等于 0 次)。例如,zo*能匹配“z”,“zo”以及“zoo”。*等价于
+
匹配前面的子表达式一次或多次(大于等于 1 次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“
于{1,}。
?
匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}
{n}
n 是一个非负整数。匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个
{n,}
n 是一个非负整数。至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有
o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
剩余29页未读,继续阅读
资源评论
tygree
- 粉丝: 0
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功