曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5332|回复: 0
打印 上一主题 下一主题

[常规] regcomp() -- 编译正则表达式字符串

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-1-7 23:10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
regcomp() 函数原型如下:
[C++] 纯文本查看 复制代码
#include <sys/types.h>
#include <regex.h>
int regcomp(regex_t *preg, const char *regex, int cflags);

regcomp() 的作用对正则表达式进行编译。其中第 2 个参数 regex 就是写好的正则表达式,编译后存储在 preg 所指向的 regex_t 结构中,该结构定义在 regex.h 中,一般无需关心。最后一个参数 cflags 用来表示采用何种正则表达式语法,有下面几种选择:

REG_EXTENDED :使用 POSIX 扩展正则语法,若不用此项那么使用 POSIX 基本语法。

REG_ICASE :对大小写不敏感。

REG_NOSUB :忽略 regexec() 中使用的 nmatch 和 pmatch 参数。

REG_NEWLINE:特殊字符(.)不用于换行符的比对,^ 字符表示行首,$ 字符表示行尾。

函数成功时返回 0 ,发生错误时可用 regerror() 函数来探明。

正则的特殊字符一般有:. * ? + ^ $ | [] \ {} () <> 。除去这些特殊字符,剩下来的就是一般字符。

. 点字符表示匹配任何一个字符。

* 星号表示匹配前面的字符 0次或多次。比如我们可以用 grep 命令来演示这种情况:
[beyes@beyes   manxl][beyes@beyes   manxl]$ echo "abcccccccccccccccabab889090abc" |grep -E -o 'abc*'
abccccccccccccccc
ab
ab
abc
[beyes@beyes   manxl]$ echo "abcccccccccccccccabab889090a" |grep -E -o 'abc*'
abccccccccccccccc
ab
ab
? 问号表示匹配零次或1次,也就是说,? 前面的字符可有可无,还是用 grep 命令来演示:
[beyes@beyes   manxl]$ echo "abc889090abd" |grep -E -o 'abc?'
abc
ab

+ 加号表示前面字符至少出现一次,如下所示:
[beyes@beyes   manxl]$ echo "abc889090abd" |grep -E -o 'abc+'
abc
注意与 ? 的区别。

| 表示或者(OR),即或者左或者右,只要有其一,或两者都具备就发生匹配,如:
[beyes@beyes   manxl]$ echo "ab889090ab88101" |grep -E -o 'abc|88'
88
88
[beyes@beyes   manxl]$ echo "ab889090ab88101" |grep -E -o 'ab|88'
ab
88
ab
88
[beyes@beyes   manxl]$ echo "ab889090ab8101" |grep -E -o 'ab|88'
ab
88
ab

\ 对字符进行转义,使其后面所跟字符失去特殊的含义,如:
[beyes@beyes   manxl]$ echo "ab8?090ab8101" |grep -E -o '8?'
8
8
[beyes@beyes   manxl]$ echo "ab8?090ab8101" |grep -E -o '8\?'
8?

^ 表示匹配的字串在行首。

$ 表示匹配的字串在行尾。

[ ] 一左一右中括号分别表示字符集的开始和结束,如:
[beyes@beyes   manxl]$ echo "ab87090ab8101" |grep -E -o '[0-9][a-z]'
0a
如果 ^ 符号用在字符集符号中,就是不匹配这个字符集,比如:
[beyes@beyes   manxl]$ echo "ab87090ab8101" |grep -E -o '[^0-9][a-z][0-9]'
ab8
ab8
字符集可以用 - 符号来指定连续字符的范围。

下面是标注字符集和名称:

[:alnum:] :英文字母或数字,即  [a-z] 和 [A-Z] 以及 [0-9]

[:alpha:] :英文字母,即 [a-z] 和 [A-Z]

[:blank:] :空白符(space)或者制表符(tab)

[:cntrl:] : ASCII 控制字符

[:digit:] :阿拉伯数字,即 [0-9]

[:graph:] :可打印字符,但不包括空白符(' ')

[:lower:] :小写英文字符,即 [a-z]

[:print:] :可打印字符,包括空白字符(' ')

[:punct:] :标点符号或特殊符号,即非空白,非英文字母,非数字

[:space:] :空白(' '),制表('\t'),CR('\r'),换行('\n'),垂直制表符('\v'),换页 ('\f')

[:upper:] :大写英文字母,即 [A-Z]

[:xdigit:] :十六进制数字,即 [0-9], [a-f], [A-F]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 02:26 , Processed in 0.082143 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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