簡體   English   中英

C正則表達式不匹配

[英]C Regex Not Matching

我已經在http://www.regexpal.com/測試了以下正則表達式

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

成功匹配以下文件名:

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

當我在以下C代碼中實現正則表達式時,沒有收到任何匹配:

#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;
}

后續執行:

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

正則表達式似乎是正確的,我不確定為什么要獲得這些結果。


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

感謝喬納森·萊夫勒。 該行:

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

應該:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM