從Coding Horror:
一些人,當遇到一個問題,認爲 「我知道,我將使用 正則表達式。」現在他們有 兩個問題。
我的意思是:你確定正則表達式是解決問題的最好方法嗎?也許你可以測試這個字符串是否是一個帶有更多輕量級方法的URL?
編輯
我的電腦下面的程序,具有輸出重定向到/dev/null
,打印(到stderr
)
rx time: 1.730000
lw time: 0.920000
計劃清單:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <regex.h>
#include <string.h>
#include <time.h>
int goodurl_rx(const char *buf) {
static regex_t rx;
static int done = 0;
int e;
if (!done) {
done = 1;
if ((e = regcomp(&rx, "^www\\.[a-z][a-z0-9]*\\.(com|edu|org)$", REG_EXTENDED)) != 0) {
printf("Error %d compiling regular expression.\n", e);
exit(EXIT_FAILURE);
}
}
return !regexec(&rx, buf, 0, NULL, 0);
}
int goodurl_lw(const char *buf) {
if (*buf++ != 'w') return 0;
if (*buf++ != 'w') return 0;
if (*buf++ != 'w') return 0;
if (*buf++ != '.') return 0;
if (!isalpha((unsigned char)*buf++)) return 0;
while (isalnum((unsigned char)*buf)) buf++;
if (*buf++ != '.') return 0;
if ((*buf == 'c') && (*(buf+1) == 'o') && (*(buf+2) == 'm') && (*(buf+3) == 0)) return 1;
if ((*buf == 'e') && (*(buf+1) == 'd') && (*(buf+2) == 'u') && (*(buf+3) == 0)) return 1;
if ((*buf == 'o') && (*(buf+1) == 'r') && (*(buf+2) == 'g') && (*(buf+3) == 0)) return 1;
return 0;
}
int main(void) {
clock_t t0, t1, t2;
char *buf[] = {"www.alphanumerics.com", "ww2.alphanumerics.com", "www.alphanumerics.net"};
int times;
t0 = clock();
times = 1000000;
while (times--) {
printf(" %s: %s\n", buf[0], goodurl_rx(buf[0])?"pass":"invalid");
printf(" %s: %s\n", buf[1], goodurl_rx(buf[1])?"pass":"invalid");
printf(" %s: %s\n", buf[2], goodurl_rx(buf[2])?"pass":"invalid");
};
t1 = clock();
times = 1000000;
while (times--) {
printf(" %s: %s\n", buf[0], goodurl_lw(buf[0])?"pass":"invalid");
printf(" %s: %s\n", buf[1], goodurl_lw(buf[1])?"pass":"invalid");
printf(" %s: %s\n", buf[2], goodurl_lw(buf[2])?"pass":"invalid");
} while (0);
t2 = clock();
fprintf(stderr, "rx time: %f\n", (double)(t1-t0)/CLOCKS_PER_SEC);
fprintf(stderr, "lw time: %f\n", (double)(t2-t1)/CLOCKS_PER_SEC);
return 0;
}
來源
2009-11-14 19:57:20
pmg
好吧,我已經更新了我的正則表達式:「^(www | www1){1} \\。[a-z0-9] + [_] * [ - ] * [a-z0-9] * \\。(com | edu | org)$「這對任何我拋出的東西都非常有用,除了大小寫不敏感......我的編譯器不關心:」(?i)^(www | www1){1 } \\。[a-z0-9] + [_] * [ - ] * [a-z0-9] * \\。(com | edu | org)$「改善此字符串的建議?再次感謝大家,CB – 2009-11-16 16:37:41
我試着將REG_ICASE標誌添加到regexec()和regcomp(),但沒有運氣....建議? CB – 2009-11-16 17:04:46
REG_ICASE應該可以工作。您是否嘗試過regcomp(&regex,URLEXPR,REG_EXTENDED | REG_ICASE)? 而且,你能告訴我們你的目標是什麼?你正在構建真正奇怪的正則表達式......它僅適用於域名的一小部分...... – 2009-11-16 18:15:54