#include #include #include int main() { int ret; char *line = NULL; char *reg_expr = NULL; size_t line_len = 256; size_t l; static regex_t preg; regmatch_t pmatch[1]; ret = getline(®_expr, &line_len, stdin); if (ret < 1) exit(1); reg_expr[ret - 1] = '\0'; /* remove newline */ printf("Compiling regex \"%s\"\n", reg_expr); if (ret = regcomp(&preg, reg_expr, REG_EXTENDED | REG_NEWLINE) != 0) { fprintf(stderr, "regcomp() failed: %d\n", ret); exit(1); } while (1) { ret = getline(&line, &line_len, stdin); line[ret - 1] = '\0'; /* remove newline */ line_len = ret - 1; if (ret < 1) break; for (int i = 0; i < line_len; i += l ? l : 1) { pmatch[0].rm_so = 0; pmatch[0].rm_eo = line_len - i; printf("Testing string \""); for (int j = i; j < line_len; j++) printf("%c", line[j]); printf("\"...\n"); ret = regexec(&preg, line + i, 1, pmatch, REG_NOTEOL | REG_STARTEND); if (ret != 0) { printf("No match.\n"); break; } else printf("regexec match: pos %u length %u\n\t\"%s\"\n", pmatch[0].rm_so + i, pmatch[0].rm_eo - pmatch[0].rm_so, line + i + pmatch[0].rm_so); l = pmatch[0].rm_eo - pmatch[0].rm_so; } } }