c正则表达式代码不起作用?

时间:2012-03-13 09:14:28

标签: c regex url

我在下面有这个代码,用于检查用户是否输入了语法正确的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(&regex, "[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(&regex, 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, &regex, 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(&regex);

然而,即使输入的网址是正确的,正则表达式总是会失败。我知道正则表达式是正确的,但由于某种原因,它在“执行正则表达式”部分失败了。即使用户输入语法正确的URL,否则总是执行。

如果总是执行,那么else的原因是什么?

1 个答案:

答案 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.-]
  • POSIX不支持Perl样式的字符类\S。请改用[^[:space:]]
  • 需要使用BRE
  • 将量词{}写为\{\}
  • 只有ERE
  • 支持+?量词

总结一下,将regcomp()的号召替换为:

reti = regcomp(&regex, "[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,3}(/[^[:space:]]*)?$", REG_EXTENDED);