Skip to content

Instantly share code, notes, and snippets.

@ShahFaisalIslam
Forked from ianmackinnon/match.c
Last active October 21, 2019 04:57
Show Gist options
  • Save ShahFaisalIslam/eee4d58d7e528ebeb9715f9478ff0c89 to your computer and use it in GitHub Desktop.
Save ShahFaisalIslam/eee4d58d7e528ebeb9715f9478ff0c89 to your computer and use it in GitHub Desktop.
C Regex multiple matches and groups example
# gcc -Wall -o match match.c && ./match
#
#include <stdio.h>
#include <string.h>
#include <regex.h>
#include <stdlib.h>
int main ()
{
char * source = "___ abc123def ___ ghi456 ___";
char * regexString = "[a-z]*([0-9]+)([a-z]*)";
size_t maxMatches = 2;
size_t maxGroups = 3;
regex_t regexCompiled;
regmatch_t groupArray[maxGroups];
unsigned int m;
char * cursor;
char * cursorCopy = calloc(1,sizeof(char));
if (regcomp(&regexCompiled, regexString, REG_EXTENDED))
{
printf("Could not compile regular expression.\n");
return 1;
};
m = 0;
cursor = source;
for (m = 0; m < maxMatches; m ++)
{
if (regexec(&regexCompiled, cursor, maxGroups, groupArray, 0))
break; // No more matches
unsigned int g = 0;
unsigned int offset = 0;
for (g = 0; g < maxGroups; g++)
{
if (groupArray[g].rm_so == (size_t)-1)
break; // No more groups
if (g == 0)
offset = groupArray[g].rm_eo;
cursorCopy = realloc(cursorCopy,strlen(cursor) + 1);
strcpy(cursorCopy, cursor);
cursorCopy[groupArray[g].rm_eo] = 0;
printf("Match %u, Group %u: [%2u-%2u]: %s\n",
m, g, groupArray[g].rm_so, groupArray[g].rm_eo,
cursorCopy + groupArray[g].rm_so);
}
cursor += offset;
}
regfree(&regexCompiled);
free(cursorCopy);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment