Почему регулярное выражение всегда верно или всегда ложно - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь использовать регулярное выражение, чтобы определить, имеет ли предоставленный файл расширение .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 оценивал значение true, а все остальное - false.

Примеры (и желаемый результат):

  • test.csv = true ("Valid csv file.")
  • test.abc = false («Неправильный файл CSV.»)

1 Ответ

1 голос
/ 11 марта 2019

Используемое вами регулярное выражение недопустимо для разновидности регулярного выражения: дефис должен использоваться в начале / конце выражения в скобках.Также вам нужно экранировать точку, иначе она будет соответствовать любому символу.

Использование

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

См. Демонстрационную версию C .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...