c++, 正则表达式,又称正则表达式和正则表达式(英文:Regular ExpREssion,代码中常缩写为regex、regexp或re)。
正则表达式使用单个字符串来描述和匹配一系列符合特定语法规则的字符串。
在C语言中,regcomp、regexec、regfree和regerror用于处理正则表达式。处理正则表达式有三个步骤:
1.编译正则表达式regcomp;
2.匹配正则表达式,regexec;
3.释放正则表达式。
以下是对这三个功能的详细解释
1、int regcomp (regex_t *compiled,const char *pattern,int cflags)
该函数将指定的正则表达式模式编译成编译好的特定数据格式,可以使匹配更加有效。regexec函数将使用这些数据在目标文本字符串中进行模式匹配。执行成功并返回0。
参数描述:
(1) regex _ t是一种结构化数据类型,用于存储编译后的正则表达式,其成员re_nsub用于存储正则表达式中子正则表达式的个数,子正则表达式是用括号括起来的部分表达式。
模式是指向我们编写的正则表达式的指针。
cflags有以下四个值或其or运算(|)后的值:
REG_EXTENDED匹配一个更强大的扩展正则表达式。
匹配字母时,REG_ICASE忽略大小写。
REG_NOSUB不需要存储匹配的结果。
REG_NEWLINE识别换行符,这样$可以从行尾匹配,$可以从行首匹配。
2. int regexec (regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr [], int eflags)
当我们编译正则表达式时,我们可以用regexec匹配我们的目标文本字符串。如果在编译正则表达式时没有将cflags的参数指定为REG_NEWLINE,缺省情况下会忽略换行符。
也就是说,整个文本字符串被视为一个字符串。执行成功并返回0。
Regmatch_t是一种结构数据类型,在regex.h:
typedef struct
{
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
成员rm_so存储匹配文本字符串在目标字符串中的起始位置,rm_eo存储结束位置。通常我们以数组的形式定义一组这样的结构。因为通常我们的正则表达式也包含子正则表达式。数组0单元存储主正则表达式的位置,
以下单元依次存储子正则表达式的位置。
参数描述:
compiled是用regcomp函数编译过的正则表达式。
字符串是目标文本字符串。
nmatch是regmatch_t结构数组的长度。
MatchptrregMatch _ T类型的结构数组,存储匹配文本字符串的位置信息。
eflags有两个值。
REG_NOTBOL按照我的理解,如果指定了这个值,那么我们不会从我们的目标字符串开始匹配。总之我还是不太明白这个参数的含义;
REG_NOTEOL的功能和上面的一样,但是这个指定结束于行尾。
3. void regfree (regex_t *compiled)
当我们使用编译后的正则表达式或者重新编译其他正则表达式时,我们可以使用这个函数清空编译后的正则表达式指向的regex_t结构的内容。请记住,如果它被重新编译,
确保首先清空regex_t结构。
4. size_t regerror (int errcode, regex_t *compiled, char *buffer, size_t length)
当执行regcomp或regexec时出现错误时,可以调用此函数并返回包含错误信息的字符串。
参数描述:
errcode是regcomp和regexec函数返回的错误代码。
compiled是用regcomp函数编译过的正则表达式,该值可以为空。
buffer指向用于存储错误信息的字符串的内存空间。
长度表示缓冲区的长度。如果该错误消息的长度大于该值,regerror函数将自动截断超出的字符串,但它仍将返回完整字符串的长度。
所以我们可以先用下面的方法得到错误字符串的长度。
size_t length=regerror (errcode, compiled, NULL, 0);
关于C中处理正则表达式的方法,就分享到这里吧!
c++,以上就是本文为您收集整理的c++最新内容,希望能帮到您!更多相关内容欢迎关注。