2012-03-12 54 views
-1

嗨我有下面的代碼,這是爲了檢查輸入的網址是否有效。然而,程序總是失敗的第一個如果陳述。檢查網址與正則表達式c

regex_t regex; 
    int reti; 
    char msgbuf[100]; 

/* Compile regular expression */ 
     reti = regcomp(&regex, "^^((([hH][tT][tT][pP][sS]?|[fF][tT][pP])\:\/\/)?([\w\.\-]+(\:[\w\.\&%\$\-]+)*@)?((([^\s\(\)\<\>\\\"\.\[\]\,@;:]+)(\.[^\s\(\)\<\>\\\"\.\[\]\,@;:]+)*(\.[a-zA-Z]{2,4}))|((([01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}([01]?\d{1,2}|2[0-4]\d|25[0-5])))(\b\:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)\b)?((\/[^\/][\w\.\,\?\'\\\/\+&%\$#\=~_\[email protected]]*)*[^\.\,\?\"\'\(\)\[\]!;<>{}\s\x7F-\xFF])?)$", 0); 
     if(reti){ 
      fprintf(stderr, "Could not compile regex\n"); 
      exit(1); 
     } 

/* Execute regular expression */ 
    reti = regexec(&regex, str, 0, NULL, 0); 
    if(!reti){ 
      puts("Match"); 
    } 
    else if(reti == REG_NOMATCH){ 
      puts("No match"); 
    } 
    else{ 
      regerror(reti, &regex, msgbuf, sizeof(msgbuf)); 
      fprintf(stderr, "Regex match failed: %s\n", msgbuf); 
      exit(1); 
    } 

/* Free compiled regular expression if you want to use the regex_t again */ 
regfree(&regex); 

總是執行第一個if語句的原因是什麼?還有更好的方法來檢查url是否在語法上正確?

+2

這是一個討厭的正規表達式..你從哪裏得到它?立即看起來你不想以'^^'開頭,因爲這會匹配字符串的兩個開始。可能不是正則表達式不能編譯的原因.. – arc 2012-03-12 19:11:53

回答

1

我相信你需要使用REG_EXTENDED標誌。如果您使用regerror()來獲得更好的錯誤消息,它也會有所幫助。

除此之外,我的建議是調試一個大型的正則表達式,直到它正常工作,然後慢慢地將它們添加回去,以便您可以清楚地看到錯誤發生的位置。

0

很多人都做過類似的事情。這裏有一個來自RegexLib.com,可能會讓你開始。

你可能想用像RegexPal這樣的測試器遞增地構建正則表達式。