使用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(®ex, regex_str, REG_EXTENDED | REG_ICASE); if (reti) { fprintf(stderr, "正则编译失败\n"); return 1; // 返回错误码 } // 执行匹配 reti = regexec(®ex, test, 0, NULL, 0); // 必须释放正则资源,避免内存泄漏! regfree(®ex); if (!reti) { return 0; // 匹配成功:路径属于目标文件夹 } else if (reti == REG_NOMATCH) { return 1; // 不匹配:路径不在目标文件夹下 } else { char errbuf[100]; regerror(reti, ®ex, 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
相关产品推荐
相关产品推荐

