【发布时间】:2019-03-12 00:21:50
【问题描述】:
我正在尝试使用正则表达式来确定提供的文件是否具有 .csv 扩展名。
#include <stdio.h>
#include <regex.h>
int match(const char *string, const char *pattern) {
regex_t re;
if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
return 0;
}
int status = regexec(&re, string, 0, NULL, 0);
regfree(&re);
if (status != 0) {
return 0;
}
return 1;
}
int main(void) {
const char *reg = "^[a-zA-Z0-9-_]{1,}(.csv)$";
if (!match("test.csv", reg)) {
printf("Not a valid csv file.\n");
} else {
printf("Valid csv file.\n");
}
return 0;
}
问题在于,使用match(...),任何事情都会评估为真。另一方面,如果我尝试!match(...),则任何结果都为假。那么,我的代码有什么问题?我只希望 .csv 评估为真,其他一切为假。
示例(和期望的结果):
- test.csv = true ("有效的 csv 文件。")
- test.abc = false(“不是有效的 csv 文件。”)
【问题讨论】:
-
如果
match始终为真,那么!match将始终为假...我认为您的问题是为什么这个正则表达式不能正确匹配.csv。另外,请记住,这并不能证明某些东西是否是“有效的 csv 文件”,只是扩展名为 .csv -
您的错误处理在哪里?你的调试器告诉你什么?你甚至知道执行了哪个
return语句吗? -
你应该使用
"^[a-zA-Z0-9_-]+\\.csv$" -
出于兴趣,检查最后的字符是否为
".csv"有什么问题? -
说实话,我发现验证扩展名的概念是错误的,你应该检查文件内容是否有效,而不是文件名是否有效。