2017-01-14 6 views
0

ich den folgenden regulären Ausdruck bei http://www.regexpal.com/C Regex Nicht Passende

([A-Z]{1}[a-z]+)+([_]{1}([A-Z]{1}[a-z]+)+)+[.][a-z]+ 

getestet haben, die erfolgreich die folgenden Dateinamen übereinstimmt:

Butter_Butter.jpg  
JavaPiebald_Java_Piebald.jpg  
LowWhitePied_Pied.jpg 
Piebald_Piebald.jpg 
SpinnerBlast_Spider_Pinstripe_Pastel.jpg 
Caramel_Caramel.jpg 
LightningPied_Pied_Axanthic.jpg 
Pastel_Pastel.jpg  
Spider_Spider.jpg  
Spinner_Spider_Pinstripe.jpg 

Als ich den regulären Ausdruck in der folgenden C implementieren code, ich erhalte keine Übereinstimmungen:

#define COLLECTION_REGEX "([A-Z]{1}[a-z]+)+([_]{1}([A-Z]{1}[a-z]+)+)+[.][a-z]+" 

int is_valid_filename(char *filename) 
{ 
    regex_t regex; 
    int i, match; 
    char msgbuf[100]; 

    match = 1; 
    i = regcomp(&regex, COLLECTION_REGEX, 0); 

    if (i) 
    { 
      perror("Could not compile regex"); 
    } 
    else 
    { 
      match = regexec(&regex, filename, 0, NULL, 0); 

      if (!match) 
      { 
        puts("Match"); 
      } 
      else if (match == REG_NOMATCH) 
      { 
        puts("No match"); 
      } 
      else 
      { 
        regerror(match, &regex, msgbuf, sizeof(msgbuf)); 
        puts(msgbuf); 
      } 
    } 

    regfree(&regex); 

    return match; 
} 

anschließende Ausführung:

./a.out 
No match 
No match 
No match 
No match 
No match 
No match 
No match 
No match 
No match 
No match 

Der reguläre Ausdruck korrekt erscheint, ich bin unsicher, warum ich diese Ergebnisse bin zu erhalten.


Ausgabe von GDB:

Breakpoint 1, is_valid_filename (filename=0x609050 "Piebald_Piebald.jpg") at crp-web-builder.c:76 
76      match = regexec(&regex, filename, 0, NULL, 0); 
(gdb) continue 
Continuing. 
No match 

Breakpoint 1, is_valid_filename (filename=0x609460 "LightningPied_Pied_Axanthic.jpg") at crp-web-builder.c:76 
76      match = regexec(&regex, filename, 0, NULL, 0); 
(gdb) continue 
Continuing. 
No match 

Breakpoint 1, is_valid_filename (filename=0x609870 "SpinnerBlast_Spider_Pinstripe_Pastel.jpg") at crp-web-builder.c:76 
76      match = regexec(&regex, filename, 0, NULL, 0); 
(gdb) continue 
Continuing. 
No match 
+1

Welche Bibliothek für reguläre Ausdrücke übereinstimmen, sind Sie mit? – ffledgling

+2

Sie müssen ein Argument ungleich Null an 'reg_comp' übergeben, um den ERE-Vergleich (erweiterter regulärer Ausdruck) zu erhalten. –

Antwort

1

Dank Jonathan Leffler. Die Linie:

i = regcomp(&regex, COLLECTION_REGEX, 0); 

Sollte sein:

i = regcomp(&regex, COLLECTION_REGEX, REG_EXTENDED);