Skip to content

Instantly share code, notes, and snippets.

@ianmackinnon
Created August 8, 2012 12:01
Show Gist options
  • Select an option

  • Save ianmackinnon/3294587 to your computer and use it in GitHub Desktop.

Select an option

Save ianmackinnon/3294587 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>
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(&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;
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(&regexCompiled);
return 0;
}
@sachinites

Copy link
Copy Markdown

great example ...

@bandblad

Copy link
Copy Markdown

Fucking finally. Someone posted multiple matches case.

@ShahFaisalIslam

Copy link
Copy Markdown

Much needed code. Thank you a million times for this!

@raoulduke

Copy link
Copy Markdown

Great example, it's hard to find one that captures multiple matches. I had to write my own the other day and this would have helped. Here's my similar Gist in case it helps anyone else out.

@weiT1993

Copy link
Copy Markdown

This is extremely helpful for me. Thank you so much!

@firezdog

Copy link
Copy Markdown

Why do you get the offset from the first group rather than the last?

@cb7754

cb7754 commented Feb 9, 2021

Copy link
Copy Markdown

Excellent example. Everything you need to use regex

@d1y

d1y commented Apr 18, 2021

Copy link
Copy Markdown

Thank you!!! I Just need the example code

@zhangxy0517

Copy link
Copy Markdown

Thanks for the example.

@rtborg

rtborg commented Jun 28, 2022

Copy link
Copy Markdown

Really a great example, just what I needed. Many thanks

@321nick

321nick commented Mar 16, 2023

Copy link
Copy Markdown

i owe you my life for posting this. Thanks!

@TheCreatorAMA

Copy link
Copy Markdown

Great example, I forked this and created another one with comments to explain what is going on if anyone needs help uerstanding what is happening here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment