C中使用正则表达式
来源:互联网 发布:arduino软件下载 编辑:程序博客网 时间:2024/05/16 17:29
C中使用正则表达式大致分为一下几个步骤:
1.编译正则表达式
2.执行匹配
3.释放内存
首先,编译正则表达式
int regcomp(regex_t *preg, const char *regex, int cflags);
reqcomp()函数用于把正则表达式编译成某种格式,可以使后面的匹配更有效。
如果函数regcomp()执行成功,并且编译结果被正确填充到preg中后,函数将返回0,任何其它的返回结果都代表有某种错误产生。
preg: regex_t结构体用于存放编译后的正则表达式;
regex: 指向正则表达式指针;
cflags:编译模式
共有如下四种编译模式:
REG_EXTENDED:使用功能更强大的扩展正则表达式
REG_ICASE:忽略大小写
REG_NOSUB:不用存储匹配后的结果
REG_NEWLINE:识别换行符,这样‘$’就可以从行尾开始匹配,‘^’就可以从行的开头开始匹配。否则忽略换行符,把整个文本串当做一个字符串处理。
其次,执行匹配
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
preg: 已编译的正则表达式指针;
string:目标字符串;
nmatch: pmatch数组的长度;
pmatch:结构体数组,存放匹配文本串的位置信息;
eflags:匹配模式
共两种匹配模式:
REG_NOTBOL: The match-beginning-of-line operator always fails to match (but see the compilation flag REG_NEWLINE above). This flag may be
used when different portions of a string are passed to regexec and the beginning of the string should not be interpreted as the beginning of the line.
REG_NOTEOL: The match-end-of-line operator always fails to match (but see the compilation flag REG_NEWLINE above)
在调用函数regexec()进行模式匹配的过程中,可能在字符串string中会有多处与给定的正则表达式相匹配,参数pmatch就是用来保存这些匹配位置的,而参数nmatch则告诉函数regexec()最多可以把多少个匹配结果填充到pmatch数组中。当regexec()函数成功返回时,从string+pmatch[0].rm_so到string+pmatch[0].rm_eo是第一个匹配的字符串,而从string+pmatch[1].rm_so到string+pmatch[1].rm_eo,则是第二个匹配的字符串,依此类推。
最后,释放内存
void regfree(regex_t *preg);
当使用完编译好的正则表达式后,或者需要重新编译其他正则表达式时,一定要使用这个函数清空该变量。
如果在程序中针对同一个regex_t结构调用了多次regcomp()函数,POSIX标准并没有规定是否每次都必须调用regfree()函数进行释放,但建议每次调用regcomp()函数对正则表达式进行编译后都调用一次regfree()函数,以尽早释放占用的存储空间。
其他,处理错误
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
当执行regcomp 或者regexec 产生错误的时候,就可以调用这个函数而返回一个包含错误信息的字符串。
errcode: 由regcomp 和 regexec 函数返回的错误代号。
preg: 已经用regcomp函数编译好的正则表达式,这个值可以为NULL。
errbuf: 指向用来存放错误信息的字符串的内存空间。
errbuf_size: 指明buffer的长度,如果这个错误信息的长度大于这个值,则regerror 函数会自动截断超出的字符串,但他仍然会返回完整的字符串的长度。所以我们可以用如下的方法先得到错误字符串的长度。
- C中使用正则表达式
- 在c语言中使用正则表达式
- c语言中使用正则表达式
- C/C++中使用正则表达式
- C语言中使用正则表达式
- linux C 中使用正则表达式
- object C 中使用正则表达式
- object C 中使用正则表达式
- C语言中使用正则表达式
- c语言中使用正则表达式
- 【C#】C#中正则表达式的使用
- C语言中正则表达式如何使用
- C++/C中使用轻量级的正则表达式
- linux下的C中正则表达式的使用
- [转]在C语言中使用正则表达式
- linux c 语言中使用正则表达式pcre
- 在C语言中使用正则表达式的几个API
- linux C 中使用正则表达式(转)
- android:id
- 辣妈萌宝面试心得体会
- uva 11556 - Best Compression Ever(水题)
- data cleaning(数据清洗) 课程笔记
- 用于浏览图片的Activity
- C中使用正则表达式
- 私有ip
- poj 2456 Aggressive cows(二分查找)
- 生成组合和排列方法总结
- hdu 2099整除的尾数
- ORACLE 使用DBMS_METADATA.GET_DDL获取DDL语句
- uva 11561 - Getting Gold(bfs)
- ExtJS4 ComboBox选择第一个选项时不能触发select事件的处理
- php中安全模式safe_mode配置教程