为什么正则表达式始终为真或始终为假

时间:2019-03-11 16:14:25

标签: c regex

我正在尝试使用正则表达式来确定提供的文件是否具有.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(...)时,任何结果都为true。另一方面,如果我尝试!match(...),则任何结果都为false。那么,我的代码有什么问题呢?我只想将.csv评估为true,其他所有条件都为false。

示例(以及所需的结果):

  • test.csv = true(“有效的csv文件。”)
  • test.abc = false(“无效的csv文件。”)

1 个答案:

答案 0 :(得分:1)

您使用的正则表达式对正则表达式风格无效:连字符必须在方括号表达式的开头/结尾使用。另外,您需要转义点,否则它将匹配任何字符。

使用

const char *reg = "^[a-zA-Z0-9_-]+\\.csv$";

请参见C demo