struggling_learner
struggling_learner

Reputation: 1258

C regex extraction

Please consider this C code:

#include <stdio.h>
#include <regex.h>
#include <string.h>

int main(){
        char * our_string = "/var/www/html/cameras/cam7/2020-01/15/cam7-2020-01-15-17-45-20-1037-03.h264";
        regex_t re;
        //int regex_int = regcomp(&re, "cam[:digit:]", 0);
        int regex_int = regcomp(&re, "cam", 0);
        if (regex_int) {
                fprintf(stderr, "regex failed to compile!");
                return 1;
        }
        regmatch_t rm[2];
        if ((regexec(&re, our_string, 2, rm,0)) ){
                fprintf(stderr, "regex failed to exec!");
                return 1;
        }
        char temp[8192] = {0};
        memcpy(temp, our_string + rm[1].rm_so, rm[1].rm_eo - rm[1].rm_so);
        printf("We got: %s\n", temp);
        puts("Bye!");
        return 0;
}

I am trying to extract camX out of our_string, and need help. In its current form, above code is turning blank:

$ ./a.out 
We got: 
Bye!

C regex is not my forte, Please help!

Upvotes: 0

Views: 60

Answers (1)

Shawn
Shawn

Reputation: 52364

You have a couple of problems:

//int regex_int = regcomp(&re, "cam[:digit:]", 0)

If you want to match cam followed by a digit, you need (Besides uncommenting this line, of course, and commenting out the one beneath it), to put [:digit:] inside a bracket expression:

int regex_int = regcomp(&re, "cam[[:digit:]]", 0)

The second issue:

memcpy(temp, our_string + rm[1].rm_so, rm[1].rm_eo - rm[1].rm_so);

Neither of your regular expressions have any groups; the second element of the rm array is not going to have anything useful in it. You need to use the first element, which has the offsets of the complete match:

memcpy(temp, our_string + rm[0].rm_so, rm[0].rm_eo - rm[0].rm_so);

You also have a memory leak because you don't have a regfree(&re); to free up memory allocated for the regular expression. Not a big deal in a simple demo program like this, but in something bigger or longer running or that does the matching in a loop, it'll become an issue.

Upvotes: 2

Related Questions