извините за создание другого ответа, потому что у меня нет 50 репутации. Я не могу комментировать ответ @ Oscar Raig Colon.
pmatch не может соответствовать всем подстрокам, pmatch используется для сохранения смещения для подвыражения, ключ должен понять, что такое подвыражение, подвыражение "\ (\)" в BRE, "()" в ERE. если во всем регулярном выражении нет подвыражения, regexec () возвращает только смещение первой строки совпадения и помещает его в pmatch [0].
Вы можете найти пример на [http://pubs.opengroup.org/onlinepubs/007908799/xsh/regcomp.html][1]
Ниже показано, как флаг REG_NOTBOL можно использовать с regexec (), чтобы найти все подстроки в строке, которые соответствуют шаблону, предоставленному пользователем. (Для простоты примера очень мало проверок на ошибки.)
(void) regcomp (&re, pattern, 0);
/* this call to regexec() finds the first match on the line */
error = regexec (&re, &buffer[0], 1, &pm, 0);
while (error == 0) { /* while matches found */
/* substring found between pm.rm_so and pm.rm_eo */
/* This call to regexec() finds the next match */
error = regexec (&re, buffer + pm.rm_eo, 1, &pm, REG_NOTBOL);
}