用正则表达式检查网址c

时间:2012-03-12 19:08:31

标签: c regex url

您好我在下面有这个代码,用于检查输入的网址是否有效。但是程序总是在第一个if语句中失败。

    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\.\,\?\'\\\/\+&%\$#\=~_\-@]*)*[^\.\,\?\"\'\(\)\[\]!;<>{}\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 个答案:

答案 0 :(得分:1)

我相信你需要使用REG_EXTENDED标志。如果您使用regerror()来获取更好的错误消息,也会有所帮助。

除此之外,我的调试正则表达式的建议就是将部分剪切掉,直到它工作,然后慢慢地将它们添加回来,这样你就可以确切地看到你出错了。

答案 1 :(得分:0)

很多人做过类似的事情。这是来自RegexLib.com的一个可能让你开始的。

您可能希望使用RegexPal等测试人员逐步构建正则表达式。