曲径通幽论坛

标题: regcomp() -- 编译正则表达式字符串 [打印本页]

作者: beyes    时间: 2012-1-7 23:10
标题: regcomp() -- 编译正则表达式字符串
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]




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2