I\'ve been struggling with regular expressions in C (just /usr/include/regex.h
).
I have (let\'s say) hundreds of regexps and one of them can match
I assume your regex_match
is some combination of regcomp and regexec
. To enable grouping, you need to call regcomp
with the REG_EXTENDED
flag, but without the REG_NOSUB
flag (in the third argument).
regex_t compiled;
regcomp(&compiled, "(match1)|(match2)|(match3)", REG_EXTENDED);
Then allocate space for the groups. The number of groups is stored in compiled.re_nsub
. Pass this number to regexec
:
size_t ngroups = compiled.re_nsub + 1;
regmatch_t *groups = malloc(ngroups * sizeof(regmatch_t));
regexec(&compiled, str, ngroups, groups, 0);
Now, the first invalid group is the one with a -1 value in both its rm_so
and rm_eo
fields:
size_t nmatched;
for (nmatched = 0; nmatched < ngroups; nmatched++)
if (groups[nmatched].rm_so == (size_t)(-1))
break;
nmatched
is the number of parenthesized subexpressions (groups) matched. Add your own error checking.