-
-
Save kwccoin/aef5a30ccb1f50e19a690dc0674db3ed to your computer and use it in GitHub Desktop.
C Regex multiple matches and groups example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# gcc -Wall -o match match.c && ./match | |
# | |
#include <stdio.h> | |
#include <string.h> | |
#include <regex.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; | |
if (regcomp(®exCompiled, regexString, REG_EXTENDED)) | |
{ | |
printf("Could not compile regular expression.\n"); | |
return 1; | |
}; | |
m = 0; | |
cursor = source; | |
for (m = 0; m < maxMatches; m ++) | |
{ | |
if (regexec(®exCompiled, 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; | |
char 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(®exCompiled); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment