一个段程序用到了<regex.h>中的正则表达式来识别字符串,写个小博客给自己记录一下。
也是查过才发现原来C语言也可以直接使用库函数来进行字符串匹配,当然<regex.h>由于不是标准的C语言库函数,所以只在linux系统中有,Windows的用户可能就得另想办法了。
<regex.h>中有四个函数,分别是:
其中包括两种数据类型regex_t与regmatch_t。int regcomp(regex_t *preg, const char *pattern, int cflags); int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags); size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size); void regfree(regex_t *preg);
四个函数对应着运用正则表达式进行字符串匹配的四个步骤。
1.首先是regcomp函数对正则表达式进行编译,当然得先找到函数需要的参数:
regex_t类型:包含size_t类型的成员re_nsub,英文解释为Number of parenthesised subexpressions;
char*类型:指向要匹配的模式字符串的指针;
int类型:可省略或多选的参数,包括
- REG_EXTENDED
- Use Extended Regular Expressions. REG_ICASE
- Ignore case in match. REG_NOSUB
- Report only success/fail inregexec(). REG_NEWLINE
- Change the handling of newline characters, as described in the text. regcomp成功则返回0,失败返回其他值。
2.regexec函数执行字符串匹配,匹配成功返回0值,失败返回其他值。
函数包括5个参数:
regex_t类型的preg参数第一步已经介绍;
string参数为要进行匹配的目标字符串;
nmatch为regmatch_t类型的pmatch数组中元素的个数;
pmatch数组为存储匹配信息的数组,其中元素为regmatch类型至少包含:
regoff_t | rm_so | Byte offset from start of string to start of substring. |
regoff_t | rm_eo | Byte offset from start of string of the first character after the end of substring. |
REG_NOTBOL:string中的首字符不是行的开头,所以模式中的特殊字符'^'不会匹配行string的开头;
REG_NOTEOL:由于string的末字符不是行的末字符,所以模式中的特殊字符'$'不会匹配string的末尾;
3.regerror函数很好理解,可以不用;
4.regfree函数则为将编译的模式字符串释放为正常字符串;