C语言regexec返回不匹配问题:字符串符合正则却不匹配
问题分析与解决
你的问题出在正则表达式的语法不符合POSIX扩展正则规范,具体是其中的(*)写法错误。
核心错误点
POSIX扩展正则中,*是量词,必须用来修饰前面的某个匹配单元(比如字符、字符组、括号内的子表达式),单独使用*是非法语法。你写的(*|\\d{1,3})本意是匹配“空字符串或1-3位数字”,但(*)的写法完全不符合规范,导致正则引擎无法正确解析你的匹配规则。
修正方案
把正则中的(*)替换为()(表示匹配空字符串),或者更简洁地用\\d{0,3}(表示0到3位数字,等价于空或1-3位数字)。修正后的正则表达式有两种写法可选:
- 保留分支结构的写法:
^\\d{1,8}_[A-Z]{3}_(|\\d{1,3})_(|\\d{1,3})$
- 更简洁的量词写法:
^\\d{1,8}_[A-Z]{3}_\\d{0,3}_\\d{0,3}$
修正后的完整代码
#include <regex.h> #include <stdio.h> #include <stdbool.h> static char input[] = "00001415_AXI_7_16"; static bool checkSn(char *input) { regex_t regex; // 使用修正后的正则表达式 if (regcomp(®ex, "^\\d{1,8}_[A-Z]{3}_\\d{0,3}_\\d{0,3}$", REG_EXTENDED)) { fprintf(stderr, "Error during creating regex\n"); return false; } int ret = regexec(®ex, input, 0, NULL, 0); regfree(®ex); // 必须释放正则资源,避免内存泄漏 return ret == 0; } // 测试主函数 int main() { printf("Check result: %s\n", checkSn(input) ? "true" : "false"); return 0; }
额外注意事项
- 调用
regcomp成功后,必须用regfree释放正则结构体,否则会造成内存泄漏,你的原代码遗漏了这一步。 - 可以通过
regerror函数获取更详细的正则编译错误信息,方便排查问题,比如:
char errbuf[1024]; int err = regcomp(®ex, "...", REG_EXTENDED); if (err != 0) { regerror(err, ®ex, errbuf, sizeof(errbuf)); fprintf(stderr, "Regex compile error: %s\n", errbuf); return false; }
内容的提问来源于stack exchange,提问作者Igi
相关产品推荐
相关产品推荐

