使用C语言getdents与正则过滤文件失败,请求排查问题
排查正则表达式匹配失败问题(结合getdents系统调用)
看起来你遇到的核心问题是正则表达式的转义处理错误,导致正则引擎无法正确解析你想要的匹配规则。咱们一步步拆解问题并修复:
问题根源:C字符串与正则转义的混淆
你当前代码里的正则定义是:
const char *pattern = "^(image_)\\\\d{3,6}_201412\\\\d{2}_\\\\d{6}\\\\.jpg";
在C语言中,字符串里的\需要转义成\\才能被正确解析为单个反斜杠。而正则表达式里的\d表示匹配数字,所以在C字符串里应该写成\\d(让正则引擎最终看到\d)。但你现在写的是\\\\d,这会让正则引擎实际接收到的是\\d——也就是字面量的\加上字母d,这自然匹配不了任何数字!同理,\\.才是正则里匹配点号的正确写法,你这里的\\\\.也多了一层转义。
修复方案
把正则表达式的定义修正为:
const char *pattern = "^(image_)\\d{3,6}_201412\\d{2}_\\d{6}\\.jpg";
这样,C字符串解析后传递给regcomp的就是正确的正则模式:^(image_)\d{3,6}_201412\d{2}_\d{6}\.jpg,完全符合你想要的匹配规则。
额外的小检查
- 你使用了
REG_EXTENDED标志,这是正确的——因为{3,6}这种数量限定符在扩展正则语法中不需要额外转义,能正常生效。 REG_ICASE标志会让匹配忽略大小写(比如IMAGE_xxx.jpg也会被匹配),如果你的需求是严格区分大小写,可以去掉这个标志。regexec里的pmatch数组大小设为2是足够的:第0个元素存储整个匹配的结果,第1个存储你定义的捕获组(image_)的内容。- 建议给
regcomp加上错误处理,避免正则编译失败时程序无提示继续运行:if (regcomp(®, pattern, REG_EXTENDED | REG_ICASE) != 0) { handle_error("regcomp"); }
修复后的核心代码片段
regex_t reg; regmatch_t pmatch[2]; // 匹配整个字符串 + 1个捕获组,大小2足够 // 修正后的正则表达式 const char *pattern = "^(image_)\\d{3,6}_201412\\d{2}_\\d{6}\\.jpg"; // 编译正则,REG_ICASE可选,按需调整 if (regcomp(®, pattern, REG_EXTENDED | REG_ICASE) != 0) { handle_error("regcomp"); }
补充说明
你当前代码里用strstr匹配NAME宏的逻辑是正常工作的,但正则部分因为转义错误才没触发。修正后,符合规则的文件会被正则正确识别,同时保留了getdents的高效性,完全适配10万+文件的场景。
内容的提问来源于stack exchange,提问作者Ossama
相关产品推荐
相关产品推荐

