Регулярное выражение в C - PullRequest
1 голос
/ 14 июня 2011

Я пытаюсь сопоставить строку "123,1234", используя regex.h. Следующая схема делает работу:

"^[0-9]\{1,\},[0-9]\{1,\}$"

Если я даю это в качестве аргумента командной строки, он работает нормально. Но когда я использую его внутри кода C, он не работает. Возможно, потому что идентифицирует обратную косую черту как escape-символы.

Пример кода:

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

int main (int argc, char * argv[]){
    regex_t regex;
    int reti;
    char msgbuf[100];
    char * string, * pattern;

    string = "123,1234";
    pattern = "^[0-9]\{1,\},[0-9]\{1,\}$";

    if(regcomp(&regex, pattern, 0))
    {
            fprintf(stderr, "Could not compile regex\n");
            exit(107);
    }

    if(!(reti = regexec(&regex, string, 0, NULL, 0)))
    {
            printf("MATCH\n");
    }
    else if(reti == REG_NOMATCH)
    {
            printf("NO MATCH\n");
    }
    else
    {
            regerror(reti, &regex, msgbuf, sizeof(msgbuf));
            fprintf(stderr, "Regex match failed: %s\n", msgbuf);
            exit(107);
    }

    regfree(&regex);

    return 0;
}

Как я могу решить это?

Ответы [ 4 ]

3 голосов
/ 14 июня 2011

Ваше регулярное выражение ERE, а не BRE, поэтому вам нужно передать флаг REG_EXTENDED в regcomp. Затем, как уже говорили другие, удалите и обратную косую черту.

3 голосов
/ 14 июня 2011

^[0-9]{1,},[0-9]{1,}$ Убери \ обратную косую черту. Они избегают персонажа, следующего за ним.

2 голосов
/ 14 июня 2011

Чтобы переопределить косую черту как escape-последовательность, в C используется косая черта, чтобы избежать косой черты, поэтому \ становится \\.

Однако, поскольку вы не передаете строку в командулиния, фигурные скобки { и } не будут перехвачены парсером оболочки, так что вы можете просто попробовать это без всех косых черт.

"^[0-9]{1,},[0-9]{1,}$"
1 голос
/ 14 июня 2011

Если косые черты рассматриваются как escape-символы, пытались ли вы удвоить их, чтобы они рассматривались как экранированные косые черты?

е

"^[0-9]\\{1,\\},[0-9]\\{1,\\}$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...