我在下面有这个代码,用于检查用户是否输入了语法正确的URL。正则表达式代码来自Regular expressions in C: examples?
printf("Enter the website URL:\n");
fgets(str, 100, stdin);
if (!strcmp(str, "\n")) {
printf("Empty URL ");
exit(2);
}
regex_t regex;
int reti;
char msgbuf[100];
/* Compile regular expression */
reti = regcomp(®ex, "[a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]{2,3}(/\\S*)?$", 0);
if (reti) {
fprintf(stderr, "Could not compile regex\n");
exit(3);
}
/* Execute regular expression */
reti = regexec(®ex, str, 0, NULL, 0);
if (!reti) {
puts("Match");
} else if (reti == REG_NOMATCH) { //This else if always executes.
puts("No match");
exit(4);
} else {
regerror(reti, ®ex, msgbuf, sizeof (msgbuf));
fprintf(stderr, "Regex match failed: %s\n", msgbuf);
exit(5);
}
/* Free compiled regular expression if you want to use the regex_t again */
regfree(®ex);
然而,即使输入的网址是正确的,正则表达式总是会失败。我知道正则表达式是正确的,但由于某种原因,它在“执行正则表达式”部分失败了。即使用户输入语法正确的URL,否则总是执行。
如果总是执行,那么else的原因是什么?
答案 0 :(得分:2)
您的模式不有效!
请注意,POSIX定义了两种正则表达式:基本(BRE)和扩展(ERE)(请参阅Wikipedia)。由于您要使用“扩展”风格,请将REG_EXTENDED
标记传递给regcomp()
。
以下是(某些?)您的模式存在的问题:
[a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]{2,3}(/\\S*)
[]
)中,您无需转义特殊字符。实际上,你无法逃避它们,[a-zA-Z0-9\-\.]
将匹配反斜杠,但不匹配连字符,因为\-\
被解释为从\
到\
的范围。如果要匹配连字符,请将其放在字符列表中的第一位或最后一位:[a-zA-Z0-9.-]
\S
。请改用[^[:space:]]
。{}
写为\{\}
+
和?
量词
总结一下,将regcomp()
的号召替换为:
reti = regcomp(®ex, "[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,3}(/[^[:space:]]*)?$", REG_EXTENDED);