我在下面有这段代码,用于检查用户是否输入了语法正确的 url。正则表达式代码是从C 中的正则表达式获得的:示例?
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);
Run Code Online (Sandbox Code Playgroud)
然而,正则表达式总是失败,即使输入的 url 是正确的。我知道正则表达式是正确的,但由于某种原因,它在“执行正则表达式”部分失败。即使用户输入了一个语法正确的 URL,else if 总是会执行。
如果总是执行 else 可能是什么原因?
你的模式是不合法!
请注意,POSIX 定义了两种类型的 Regex:基本 (BRE) 和扩展 (ERE)(请参阅Wikipedia)。由于您想使用“扩展”风格,请将REG_EXTENDED标志传递给regcomp().
以下是您的模式的(一些?)问题:
[a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]{2,3}(/\\S*)
[]) 内,您不需要转义特殊字符。实际上,您无法对它们[a-zA-Z0-9\-\.]进行转义,并且会匹配反斜杠,但不会匹配连字符,因为它\-\被解释为范围从\到\。如果要匹配连字符,请将其放在字符列表的第一个或最后一个:[a-zA-Z0-9.-]\SPOSIX 不支持Perl 风格的字符类。使用[^[:space:]]来代替。{}需要像\{\}BRE 一样编写量词+和?量词仅由ERE支持总而言之,regcomp()用这个替换调用:
reti = regcomp(®ex, "[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,3}(/[^[:space:]]*)?$", REG_EXTENDED);
Run Code Online (Sandbox Code Playgroud)