Я пытаюсь соответствовать следующие элементы в строке pcode
:Компиляция/Matching POSIX регулярных выражений в C
u
сопровождаемого 1 или 2 цифрphaseu
phasep
x
(в окружении несловных символов)y
(в окружении несловных символов)z
(окруженный без слов символов)
Я пытался реализовать матч регулярного выражения, используя функции регулярных выражений POSIX (как показано ниже), но есть две проблемы:
- скомпилированного у шаблона нет подшаблонов (т. е. compiled.n_sub == 0).
- Образец не найден совпадения в строке «u0», что действительно нужно!
Я уверен, что сама строка регулярных выражений работает в python и TextMate - моя проблема заключается в компиляции и т. Д. В C. Любая помощь в получении этой работы была бы высоко оценена.
Заранее благодарим за ответы.
if(idata=tb_find(deftb,pdata)){
MESSAGE("Global variable!\n");
char pattern[80] = "((u[0-9]{1,2})|(phaseu)|(phasep)|[\\W]+([xyz])[\\W]+)";
MESSAGE("Pattern = \"%s\"\n",pattern);
regex_t compiled;
if(regcomp(&compiled, pattern, 0) == 0){
MESSAGE("Compiled regular expression \"%s\".\n", pattern);
}
int nsub = compiled.re_nsub;
MESSAGE("nsub = %d.\n",nsub);
regmatch_t matchptr[nsub];
int err;
if(err = regexec (&compiled, pcode, nsub, matchptr, 0)){
if(err == REG_NOMATCH){
MESSAGE("Regular expression did not match.\n");
}else if(err == REG_ESPACE){
MESSAGE("Ran out of memory.\n");
}
}
regfree(&compiled);
}
Спасибо Ville! Это было прекрасно. Можете ли вы сказать мне, есть ли эквивалент для OR (|), или я должен просто компилировать и сопоставлять несколько выражений? –
Расширенный синтаксис POSIX поддерживает |. Я редактировал свой пост, чтобы включить регулярное выражение, которое должно делать то, что вам нужно (до тех пор, пока вы используете REG_EXTENDED). –
Ты играешь! Ты спас меня от второго дня ругательства и колокольчика ... Очень ценится. –