#include <stdio.h>
#include <regex.h>
#include <string.h>
int main() {
regex_t preg;
char str[] = "dave";
char regex[] = "\\(.\\)ave";
// flag REG_EXTENDED with unescaped parens in the r.e. doesn't fix anything
int ret, cflags = REG_ICASE;
// the elements of unused pmatches used to be set to -1 by regexec, but no longer. a clue perhaps.
regmatch_t pmatch[2] = {{-1,-1},{-1,-1}};
ret = regcomp(&preg, regex, cflags);
if (ret) {
return ret;
}
else
// preg.re_nsub contains the correct number of groups that regcomp recognized in the r.e. Tests succeeded for 0, 1, 2, and 3 groups.
printf("regcomp ok; re_nsub=%zu\n", preg.
re_nsub);
ret = regexec(&preg, str, 2, pmatch, 0); // 1 changed to 2 as there is Group 0 (whole match) and Group 1 (for the first capturing group)
if(ret)
else {
printf("match offsets are %d %d\n", pmatch
[0].
rm_so, pmatch
[0].
rm_eo); printf("match[0]=%*s<\n", pmatch
[0].
rm_eo, &str
[pmatch
[0].
rm_so]);
printf("submatch offsets are %d %d\n", pmatch
[1].
rm_so, pmatch
[1].
rm_eo); if(pmatch[1].rm_so != -1) {
printf("match[1]=%.*s<\n", pmatch
[1].
rm_eo, &str
[pmatch
[1].
rm_so]); }
}
return 0;
}
/*
regcomp ok; re_nsub=1
match offsets are 0 4
match[0]=dave<
submatch offsets are 0 1
match[1]=d<
*/
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxyZWdleC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgppbnQgbWFpbigpIHsKCiAgICByZWdleF90IHByZWc7CiAgICBjaGFyIHN0cltdID0gImRhdmUiOwogICAgY2hhciByZWdleFtdID0gIlxcKC5cXClhdmUiOwoKICAgIC8vIGZsYWcgUkVHX0VYVEVOREVEIHdpdGggdW5lc2NhcGVkIHBhcmVucyBpbiB0aGUgci5lLiBkb2Vzbid0IGZpeCBhbnl0aGluZwogICAgaW50IHJldCwgY2ZsYWdzID0gUkVHX0lDQVNFOwogICAgCiAgICAvLyB0aGUgZWxlbWVudHMgb2YgdW51c2VkIHBtYXRjaGVzIHVzZWQgdG8gYmUgc2V0IHRvIC0xIGJ5IHJlZ2V4ZWMsIGJ1dCBubyBsb25nZXIuIGEgY2x1ZSBwZXJoYXBzLgoKICAgIHJlZ21hdGNoX3QgcG1hdGNoWzJdID0ge3stMSwtMX0sey0xLC0xfX07CgogICAgcmV0ID0gcmVnY29tcCgmcHJlZywgcmVnZXgsIGNmbGFncyk7CiAgICBpZiAocmV0KSB7CiAgICAgICAgcHV0cygicmVnY29tcCBmYWlsIik7CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIGVsc2UKICAgICAgICAvLyBwcmVnLnJlX25zdWIgY29udGFpbnMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGdyb3VwcyB0aGF0IHJlZ2NvbXAgcmVjb2duaXplZCBpbiB0aGUgci5lLiBUZXN0cyBzdWNjZWVkZWQgZm9yIDAsIDEsIDIsIGFuZCAzIGdyb3Vwcy4KICAgICAgICBwcmludGYoInJlZ2NvbXAgb2s7IHJlX25zdWI9JXp1XG4iLCBwcmVnLnJlX25zdWIpOwoKICAgIHJldCA9IHJlZ2V4ZWMoJnByZWcsIHN0ciwgMiwgcG1hdGNoLCAwKTsgLy8gMSBjaGFuZ2VkIHRvIDIgYXMgdGhlcmUgaXMgR3JvdXAgMCAod2hvbGUgbWF0Y2gpIGFuZCBHcm91cCAxIChmb3IgdGhlIGZpcnN0IGNhcHR1cmluZyBncm91cCkKCiAgICBpZihyZXQpCiAgICAgICAgcHV0cygibm8gbWF0Y2giKTsKICAgIGVsc2UgewogICAgICAgIHByaW50ZigibWF0Y2ggb2Zmc2V0cyBhcmUgJWQgJWRcbiIsIHBtYXRjaFswXS5ybV9zbywgcG1hdGNoWzBdLnJtX2VvKTsKICAgICAgICBwcmludGYoIm1hdGNoWzBdPSUqczxcbiIsIHBtYXRjaFswXS5ybV9lbywgJnN0cltwbWF0Y2hbMF0ucm1fc29dKTsKCiAgICAgICAgcHJpbnRmKCJzdWJtYXRjaCBvZmZzZXRzIGFyZSAlZCAlZFxuIiwgcG1hdGNoWzFdLnJtX3NvLCBwbWF0Y2hbMV0ucm1fZW8pOwogICAgICAgIGlmKHBtYXRjaFsxXS5ybV9zbyAhPSAtMSkgewogICAgICAgICAgICBwcmludGYoIm1hdGNoWzFdPSUuKnM8XG4iLCBwbWF0Y2hbMV0ucm1fZW8sICZzdHJbcG1hdGNoWzFdLnJtX3NvXSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0KLyoKcmVnY29tcCBvazsgcmVfbnN1Yj0xCm1hdGNoIG9mZnNldHMgYXJlIDAgNAptYXRjaFswXT1kYXZlPApzdWJtYXRjaCBvZmZzZXRzIGFyZSAwIDEKbWF0Y2hbMV09ZDwKKi8=