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

使用C语言regex.h库验证文件名是否属于指定文件夹

用C语言regex.h判断文件名是否属于指定文件夹的正确姿势

嘿,作为C语言正则的新手,你这个需求其实挺实用的——用regex.h来校验文件路径是否落在目标文件夹下对吧?先看看你给出的代码片段,我帮你补全逻辑,再梳理几个关键坑点,给你一套能直接跑的方案。

首先,先把你写的代码补全并修正错误:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <regex.h> 

int checkregex(char regex_str[], char test[]) { 
    regex_t regex; 
    printf("正则表达式: %s\n", regex_str); 
    
    // 编译正则表达式,用REG_EXTENDED启用扩展正则,REG_ICASE忽略大小写(可选)
    int reti = regcomp(&regex, regex_str, REG_EXTENDED | REG_ICASE); 
    if (reti) { 
        fprintf(stderr, "正则编译失败\n");
        return 1; // 返回错误码
    }
    
    // 执行匹配
    reti = regexec(&regex, test, 0, NULL, 0);
    
    // 必须释放正则资源,避免内存泄漏!
    regfree(&regex);
    
    if (!reti) {
        return 0; // 匹配成功:路径属于目标文件夹
    } else if (reti == REG_NOMATCH) {
        return 1; // 不匹配:路径不在目标文件夹下
    } else {
        char errbuf[100];
        regerror(reti, &regex, errbuf, sizeof(errbuf));
        fprintf(stderr, "匹配出错: %s\n", errbuf);
        return 2; // 匹配过程出错
    }
}

接下来,几个核心要点你得注意:

  • 正则表达式的写法是关键:
    如果你要匹配绝对路径(比如/home/mustafa/docs/),正则要写成^/home/mustafa/docs/.*——开头的^确保路径从根目录开始匹配,避免出现部分匹配(比如/home/mustafa/docs_backup/file.txt被误判);.*用来匹配文件夹下的任意文件或子文件夹路径。
    如果是相对路径(比如当前目录下的docs/),可以写成^(\./)?docs/.*,这样既能匹配docs/file.txt,也能匹配./docs/subdir/note.txt。

  • 转义路径中的正则特殊字符:
    要是你的目标文件夹路径里有.、*这类正则特殊字符(比如/home/mustafa/my.docs/),直接拼进正则会出问题——正则里的.会匹配任意字符,导致错误匹配。所以得加个辅助函数转义这些特殊字符:

// 辅助函数:转义正则中的特殊字符
void escape_regex_chars(char *dest, const char *src, size_t dest_size) {
    dest[0] = '\0';
    size_t dest_len = 0;
    while (*src != '\0' && dest_len < dest_size - 2) { // 预留转义符和终止符的空间
        switch (*src) {
            case '.': case '^': case '$': case '*': case '+': case '?':
            case '(': case ')': case '[': case ']': case '{': case '}':
            case '|': case '\\':
                dest[dest_len++] = '\\';
                dest[dest_len++] = *src;
                break;
            default:
                dest[dest_len++] = *src;
                break;
        }
        src++;
    }
    dest[dest_len] = '\0';
}

最后,给你一个完整的示例用法,直接编译就能跑:

int main() {
    // 目标文件夹:这里用绝对路径举例
    const char *target_folder = "/home/mustafa/my.docs/";
    
    // 转义路径中的特殊字符
    char escaped_folder[256];
    escape_regex_chars(escaped_folder, target_folder, sizeof(escaped_folder));
    
    // 构建最终的正则表达式
    char regex_pattern[256];
    snprintf(regex_pattern, sizeof(regex_pattern), "^%s.*", escaped_folder);
    
    // 测试几个路径
    const char *test_paths[] = {
        "/home/mustafa/my.docs/report.pdf",       // 应该匹配
        "/home/mustafa/photos/me.jpg",            // 不匹配
        "/home/mustafa/my.docs/subdir/note.txt",  // 匹配子文件夹
        "/home/mustafa/my.docs_backup/file.txt"   // 不匹配(避免部分匹配)
    };
    
    for (int i = 0; i < sizeof(test_paths)/sizeof(test_paths[0]); i++) {
        int result = checkregex((char*)regex_pattern, (char*)test_paths[i]);
        if (result == 0) {
            printf("✅ 路径 %s 属于目标文件夹\n", test_paths[i]);
        } else if (result == 1) {
            printf("❌ 路径 %s 不属于目标文件夹\n", test_paths[i]);
        } else {
            printf("⚠️ 路径 %s 匹配过程出错\n", test_paths[i]);
        }
    }
    
    return 0;
}

编译运行的话,直接用gcc:gcc -o path_check path_check.c,然后运行./path_check就能看到结果啦。

内容的提问来源于stack exchange,提问作者Mustafa Süve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:58:39