正则表达式
基本概念
字符 | 含义 | 举例 |
---|---|---|
. | 匹配任意一个字符 | 如“abc.”,可以匹配abc2、abcd、abc%等 |
[] | 匹配括号中的任意一个字符 | 如“[abc]d”,可以匹配ad、bd、cd |
- | 在[]括号范围内表示范围 | 如“[0-9]”,表示匹配0至9中任意一个数字 |
^ | 位于[]内开头,匹配除括号内字符以外的任意字符 | 如“[^ab]”,表示匹配除了a、b之外的其他字符 |
? | 紧跟其前面的单元匹配零次或者一次 | |
+ | 紧跟其前面的单元匹配一次或者多次 | |
* | 紧跟其前面的单元匹配零次或者多次 | |
{N} | 紧跟其前面的单元匹配精确的N次 | 如“k{3}”,表示精确匹配kkk。 |
{N,} | 紧跟其前面的单元匹配至少N次 | |
{,M} | 紧跟其前面的单元匹配最多M次 | |
{N,M} | 紧跟其前面的单元匹配至少N次,最多M次 | |
^ | 匹配行首的位置 | |
$ | 匹配行尾的位置 | |
\< | 匹配单词开头的位置 | |
\> | 匹配单词结尾的位置 | |
\b | 匹配单词的边界 | 如“\bA.{3}T\b”,表示匹配类似A123t、AXYZT等单词 |
\B | 匹配非单词边界 | 如“\Bh\B”,表示匹配的h不在单词边界,如host则不符合,因为h在单词的边界,而she则符合匹配。 |
| | 连接两个子表达式,表示或的关系 | 如“n(ei|mn)”,匹配nei或者nmn |
() | 将正则表达式部分组成分组,可引用分组 | |
\ | 转义字符 | |
\d | 匹配数字字符,效果同[0-9] | |
\D | 匹配非数字字符,效果同[0-9],或者同[\d] | |
\w | 匹配单词字符,效果同[_a-zA-Z0-9] | |
\W | 匹配非单词字符 | |
\s | 匹配空白字符,效果同[ \t\n\r],注意括号中包括空格 | |
\S | 匹配非空白字符 | |
() | 分组、子模式(subpattern) | |
\1、\2… | 通过后向引用重用捕获内容 | 如“(the)(china people) \2 \1”,这里的第一个分组是the、第二个分组是china people,则\1表示第一个分组,\2表示第二个分组。 |
(?:name) | 非捕获分组 | 如“(?:the|THE)”,非捕获分组不会将其存储在内存,无法后向引用 |
C语言实现正则表达式
标准的C与C++都不支持正则表达式,但是在某些场景下,正则表达式存在可以为程序带来便利。
在C语言中,一些库函数可以帮助我们实现在C中使用正则表达式的诉求。
以下介绍在Linux环境下C语言中处理正则表达式的常用函数。
regcomp函数
函数原型为:
#include<regex.h>
int regcomp(regex_t *compiled, const char *pattern, int cflags);
函数作用:将指定的正则表达式格式pattern编译成一种特定的数据格式compiled,这样可以使得正则表达式的匹配更加有效。函数执行成功返回0。
参数说明:
-
regex_t是一个结构体数据类型,用来存放编译后的正则表达式,其成员re_nsub用来存储正则表达式组合的子正则表达式的个数。
-
pattern指向要编译的正则表达式字符串。
-
cflags是标志位。可以取值为:
a、REG_EXTENDED:以功能更加强大的扩展正则表达式的方式进行匹配
b、REG_ICASE:匹配字母时,忽略大小写;
c、REG_NOSUB:不用存储匹配后的结果;
d、REG_NEWLINE:识别换行符,则符号^与$可以分别从行首与行尾开始匹配。
###regexec函数
函数原型为:
#include<regex.h>
int regexec(regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr[], int eflags);
函数作用:使用正则表达式执行匹配目标文本。如果在调用函数regcomp编译正则表达式时,没有指定cflags标志位为REG_NEWLINE,则默认情况下忽略换行符,即将整个文本内的字符串当作一个整体来处理。函数执行成功返回0。
参数说明:
- compiled是使用函数regcomp编译好的正则表达式;
- string是需要匹配的目标字符串;
- nmatch是regmatch_t结构体数组的长度;
- matchptr是regmatch_t类型的结构体数组,存放匹配字符串的位置信息;
- eflags取值为REG_NOTBOL,即让特殊字符^无作用,eflags取值为REG_NOTEOL,即让特殊字符$无作用。
regmatch_t是一个结构体数据类型:
typedef struct {
regoff_t rm_so