Avatar billede legrand Nybegynder
04. marts 2011 - 15:58 Der er 7 kommentarer og
1 løsning

POSIX regex i C

Hej,

Jeg har følgende regex pattern: (?:^|\s)@([a-zA-Z0-9_-]+)
Det har til formål at finde alle ord i en streng der starter med @. Jeg har testet mit pattern med diverse værktøjer og det ser ud til at være fint, men når jeg prøver at implementere det i C, virker det ikke som det skal. Er mit pattern korrekt i forbindelse med POSIX regex i C? Kan nogen hjælpe mig med at få det til at virke efter hensigten?

Hilsen LeGrand
Avatar billede arne_v Ekspert
04. marts 2011 - 16:34 #1
Selve regex ser valid ud.

Jeg ville nok bruge:

"(?:\\b)(@[a-zA-Z0-9_-]+)(?:\\b)"

hvordan ser din kode ud?
Avatar billede legrand Nybegynder
05. marts 2011 - 15:40 #2
#include <stdio.h>
#include <regex.h>

int main(void)
{
    match("@Test", "(?:^|\\s)@([a-zA-Z0-9_-]+)");

    return 0;
}

int match(const char *string, char *pattern)
{
    int status;
    char msgbuf[100];
    regex_t re;
   
    if(regcomp(&re, pattern, REG_ICASE | REG_NOSUB) != 0)
        return 0;
   
    status = regexec(&re, string, (size_t)0, NULL, 0);
   
    if(!status)
        printf("match!\n");
    else if(status == REG_NOMATCH)
        printf("no match!\n");
   
    regfree(&re);
   
    if(status != 0)
        return 0;
   
    return 1;
}
Avatar billede legrand Nybegynder
05. marts 2011 - 16:37 #3
Jeg har debugget mig frem til at regexec returnerer REG_BADPAT...så det ser ud til at der alligevel er noget galt med mit pattern.

Nogen forslag?
Avatar billede arne_v Ekspert
05. marts 2011 - 19:23 #4
Hmm.

Dit program virker faktisk under cygwin.

Hvilken platform arbejder du på?

Jeg gætter på at problemet har noget at gøre med forskellen på POSIX og Perl regex.

Prøv evt at erstat:

match("@Test", "(?:^|\\s)@([a-zA-Z0-9_-]+)");

med:

match("@Test", "(^|[ ])@([a-zA-Z0-9_-]+)");
Avatar billede legrand Nybegynder
08. marts 2011 - 14:52 #5
Jeg arbejder på en unix platform. Din løsning ser ud til at virke :]

Venter på svar
Avatar billede arne_v Ekspert
08. marts 2011 - 15:04 #6
svar
Avatar billede arne_v Ekspert
08. marts 2011 - 15:04 #7
Kan du ikke faa PCRE til den platform?

Saa skulle du have Perl syntax support.
Avatar billede legrand Nybegynder
08. marts 2011 - 15:39 #8
Jeg har netop skiftet til PCRE og bruger nu Perl syntax..men i forbindelse med det oprindelige spørgsmål virkede din løsning
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester