You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,完全符合你想要的匹配规则。

额外的小检查

  1. 你使用了REG_EXTENDED标志,这是正确的——因为{3,6}这种数量限定符在扩展正则语法中不需要额外转义,能正常生效。
  2. REG_ICASE标志会让匹配忽略大小写(比如IMAGE_xxx.jpg也会被匹配),如果你的需求是严格区分大小写,可以去掉这个标志。
  3. regexec里的pmatch数组大小设为2是足够的:第0个元素存储整个匹配的结果,第1个存储你定义的捕获组(image_)的内容。
  4. 建议给regcomp加上错误处理,避免正则编译失败时程序无提示继续运行:
    if (regcomp(&reg, 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(&reg, pattern, REG_EXTENDED | REG_ICASE) != 0) {
    handle_error("regcomp");
}

补充说明

你当前代码里用strstr匹配NAME宏的逻辑是正常工作的,但正则部分因为转义错误才没触发。修正后,符合规则的文件会被正则正确识别,同时保留了getdents的高效性,完全适配10万+文件的场景。

内容的提问来源于stack exchange,提问作者Ossama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:01:44