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

use*_*430 1 c regex url

我在下面有这段代码,用于检查用户是否输入了语法正确的 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(&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);
Run Code Online (Sandbox Code Playgroud)

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

如果总是执行 else 可能是什么原因?

Fer*_*yer 5

你的模式是合法!

请注意,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(&regex, "[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,3}(/[^[:space:]]*)?$", REG_EXTENDED);
Run Code Online (Sandbox Code Playgroud)