我是靠谱客的博主 文艺柠檬,最近开发中收集的这篇文章主要介绍正则表达式(c,boost)使用手册1. C Regex2. boost Regex3. Reference,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
1. C Regex
1.1. 前言
GUN C Library支持两种正则表达式的匹配接口,其一为标准的POSIX.2接口,其二为GUN C Library已经有的。两种接口都声明在regex.h中,如果#define _POSIX_C_SOURCE,将使用POSIX.2接口。
1.2. 编译正则表达式
这里的编译不是指生成一条机器指令,而是指生成一个特殊的结构体:regex_t。regex_t中保存有编译后的正则表达式,它实际上是一个结构体,其中通常使用到的成员变量是re_nsub,存放括号里的字表达式数目。
在定义regex_t后,我们就可以编译了:
int regcomp (regex_t *compiled, const char *restrict pattern, int cflags)
complied : 为前面定义的regex_t变量地址
pattern : 为自定义的正则表达式
cflags : 指定正则表达式语法及语义的选项,其中选项主要如下:
REG_NOSUB : 使用此标志,regcomp将不保存子表达式的相关信息,如果不使用此标志,则compiled->re_nsub将记录子表达式数目。
REG_EXTENDED : 将pattern作为扩展的正则表达式,而不是basic正则表达式。
REG_ICASE : 匹配过程中忽略大小写
REG_NEWLINE:
返回值:
成功返回0,失败返回非0值,可通过regerror进行详细信息查看。
1.3. 匹配正则表达式
int regexec (const regex_t *compiled, const char *string, size_t nmatch, regmatch_t matchptr[restrict], int eflags)
compiled :为编译后的regex_t变量
string :为待匹配的字符串
matchptr :存储匹配结果信息
eflags :位模式,主要选项如下:
REG_NOTBOL
Do not regard the beginning of the specified string as the beginning of a line; more generally, don't make any assumptions about what text might precede it.
REG_NOTEOL
Do not regard the end of the specified string as the end of a line; more generally, don't make any assumptions about what text might follow it.
返回值:
成功返回0,失败返回非0值,可通过regerror进行详细信息查看。
regmatch_t:存放匹配结果的偏移信息,主要包含两个成员变量:
rm_so :匹配成功的子串在原字符串中的起始偏移地址
rm_eo :匹配成功的子串在原字符串中的结束偏移地址
在传递的regmatch_t数组中,index 0保存匹配整个正则表达式的字符串信息,index i(i>0)则依次匹配第i个子表达式匹配信息。如果你不关心这些信息,可以设置nmatch为0,或者设置REG_NOSUB标志。
1.4. 释放
在再次使用regex_t进行其他正则表达式匹配前,必须释放regex_t结构体。void regfree (regex_t *compiled)
获取执行错误信息
size_t regerror (int errcode, const regex_t *compiled, char *restrict buffer, size_t length)
char *get_regerror (int errcode, regex_t *compiled)
{
size_t length = regerror (errcode, compiled, NULL, 0);
char *buffer = xmalloc (length);
(void) regerror (errcode, compiled, buffer, length);
return buffer;
}
1.5. 示例
#include <sys/types.h>
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* get_regerror(int errorcode , regex_t *complied)
{
size_t length = regerror(errorcode , complied , NULL , 0);
char *buffer = (char*)malloc(length);
regerror(errorcode , complied , buffer , length);
return buffer;
}
int main(int argc , char **argv)
{
regex_t regex;
const size_t nmatch = 1;
regmatch_t pmatch[1];
const char pattern[] = "[[:digit:]]+";
char *buf = "12abc45";
int status;
if(0 != (status = regcomp(®ex , pattern , REG_EXTENDED))){
printf("regcomp failed:%sn",get_regerror(status , ®ex));
regfree(®ex);
exit(1);
}
while(1){
status = regexec(®ex , buf , nmatch , pmatch , 0);
if(REG_NOMATCH == status){
printf("%sn",get_regerror(status , ®ex));
break;
}else if(0 == status){
printf("Match:");
size_t length = pmatch[0].rm_eo - pmatch[0].rm_so;
char *result = (char*)malloc(length+1);
strncpy(result,buf+pmatch[0].rm_so,length);
result[length]='