регулярное выражение не работает во время выполнения в c - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь построить регулярное выражение с помощью библиотеки regex.h.

Я проверил свое выражение в https://regex101.com/ с помощью ввода «00001206 ffffff00 00200800 00001044», и я также проверил это на python, оба дали мне ожидаемый результат. когда я запустил приведенный ниже код на c (поверх unix), я получил печать «нет совпадения». кто-нибудь есть какие-либо предложения?

regex_t regex;
int reti;
reti = regcomp(&regex, "([0-9a-fA-F]{8}( |$))+$", 0);
if (reti) 
{
    fprintf(stderr, "Could not compile regex\n");
    exit(1);
}

reti = regexec(&regex, "00001206 ffffff00 00200800 00001044", 0, NULL, 0);
if (!reti) 
{
     printf("Match");
 }
  else if (reti == REG_NOMATCH) {
  printf("No match bla bla\n");
   }  

1 Ответ

0 голосов
/ 04 сентября 2018

Ваш шаблон содержит якорь $, захватывающий группы с (...) и квантификатор интервалов {m,n}, поэтому вам нужно передать REG_EXTENDED методу компиляции regex:

regex_t regex;
int reti;
reti = regcomp(&regex, "([0-9a-fA-F]{8}( |$))+$", REG_EXTENDED); // <-- See here
if (reti) 
{
    fprintf(stderr, "Could not compile regex\n");
    exit(1);
}

reti = regexec(&regex, "00001206 ffffff00 00200800 00001044", 0, NULL, 0);
if (!reti) 
{
    printf("Match");
}
else if (reti == REG_NOMATCH) {
    printf("No match bla bla\n");
}  

См. онлайн-демонстрацию C печать Match.

Однако я считаю, что вам нужно сопоставить всю строку и запретить пробелы в конце, поэтому, вероятно,

reti = regcomp(&regex, "^[0-9a-fA-F]{8}( [0-9a-fA-F]{8})*$", REG_EXTENDED);

будет более точным, так как не будет допускать произвольного текста впереди и не будет завершающего пробела.

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