Я пытаюсь использовать регулярное выражение для анализа исходных файлов и поиска функций в программах на языке С, которые начинаются со слова «LOG», и за ним может следовать или не следовать второй символ из класса [1248AFM], который затем следует открывающей скобкой. Это разрабатывается под Windows с использованием mingw, но в конечном итоге будет скомпилировано и запущено под Linux с использованием gcc. Я использую учебник по регулярному выражению Яна Гойеертса в качестве руководства, и похоже, что то, что мне нужно, - это либо нуль, либо одно совпадение выражения выражения скобки, показанного выше. Нуль или один звучит так же, как метасимвол вопросительного знака, но в моих экспериментах я еще не смог заставить это работать после выражения скобки. Чтобы проиллюстрировать, что я пытаюсь сделать, у меня есть короткая программа, показанная ниже. В идеале я хотел бы иметь совпадение только на str1 и str2. Если я компилирую и запускаю его, как показано, я не получаю ни одного совпадения. Если я оставлю знак вопроса, следуя выражению скобки, я получаю соответствие только на str2, чего я ожидаю. В дополнение к вопросительному знаку, я также пробовал квантификатор интервала формы {0,1}, но также не имел успеха. Есть ли что-то иное, чем выражение в скобках, которое я должен использовать?POSIX regex - ноль или одно совпадение выражения скобки?
Dave
#include <stdio.h>
#include <regex.h>
int main(int argc, char **argv) {
regex_t regex;
int rtn = regcomp(®ex, "LOG[1248AFM]?(", 0);
if (rtn) {
printf("compile failed\n");
return(1);
}
char *str1 = " LOG(";
char *str2 = " LOGM(";
char *str3 = " LOG";
char *str4 = " LOGJ(";
int rtn1 = regexec(®ex, str1, 0, NULL, 0);
int rtn2 = regexec(®ex, str2, 0, NULL, 0);
int rtn3 = regexec(®ex, str3, 0, NULL, 0);
int rtn4 = regexec(®ex, str4, 0, NULL, 0);
printf("str1: %d\nstr2: %d\nstr3: %d\nstr4: %d\n",
rtn1, rtn2, rtn3, rtn4);
return(0);
}
Не работает в основном, попробуйте 'int rtn = regcomp (& regex," LOG [1248AFM]? [(] ", REG_EXTENDED); вместо этого (расширенный использует круглые скобки как разделители групп, следовательно, квадратные скобки вокруг) – deamentiaemundi
В BRE '?' Должно быть экранировано '\?' * (При поддержке) * –
Casimir - Я уже пробовал это, но когда я скомпилировал сбой, –