C语言中使用<regex.h>正则表达式时.*匹配失效问题求助
问题分析与修复
你的代码存在两个核心问题,导致正则匹配不符合预期:
1. 参数顺序完全颠倒
regcomp和regexec的参数逻辑搞反了:
regcomp的第二个参数应为正则表达式(pattern),用来编译匹配规则regexec的第二个参数才是待匹配的目标字符串(line),用来检查该字符串是否符合规则
你当前的代码错误地将目标字符串作为正则编译,再用正则表达式作为待匹配对象,完全违背了匹配逻辑。
2. 正则语法环境差异
regex101默认使用PCRE(Perl兼容正则),而C的<regex.h>默认采用POSIX基本正则表达式(BRE)。虽然你的#include.*在BRE中可工作,但添加REG_EXTENDED标志使用扩展正则表达式(ERE),会更贴近你在regex101中的测试习惯,避免潜在语法冲突。
修复后的代码
#include <stdio.h> #include <regex.h> int main() { char pattern[] = "#include.*"; char line[] = "#include <stdio.h>"; regex_t regex; int reg_err; // 编译正则表达式,使用扩展正则语法 reg_err = regcomp(®ex, pattern, REG_EXTENDED); if (reg_err != 0) { char err_buf[100]; regerror(reg_err, ®ex, err_buf, sizeof(err_buf)); printf("正则编译错误:%s\n", err_buf); return 1; } // 用编译好的正则匹配目标字符串 reg_err = regexec(®ex, line, 0, NULL, 0); printf("%d\n", reg_err); // 预期输出0 regfree(®ex); // 释放正则资源,避免内存泄漏 return 0; }
关键说明
- 修正参数顺序后,匹配逻辑回归正常:用
#include.*规则匹配#include <stdio.h>字符串,完全符合预期,返回0。 REG_EXTENDED标志让正则语法与regex101的PCRE更接近,后续使用+、?等限定符无需额外转义,扩展正则更便捷。- 新增错误处理与资源释放:
regcomp可能因语法错误失败,regerror可输出具体错误信息;regfree用于释放编译后的正则资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者sauro
相关产品推荐
相关产品推荐

