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] |