0

以下代码是我为我正在处理的一个更大项目的一部分编写的独立测试;它应该检测四重形式的 IPv4 地址(四个由句点分隔的最多三位数字):

#include <stdlib.h>
#include <stdio.h>
#include <regex.h>
#include <sys/types.h>

int main (int argc, char * argv []) {
   regex_t regex;
    int ret;
    char * reg = "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$";

    ret = regcomp(& regex, reg, REG_NEWLINE | REG_EXTENDED);
    if (ret) {
            printf("no compile\n");
    } else {
            printf("compile\n");
    }

    char ips [17];
    fgets(ips, 17, stdin);

    ret = regexec(& regex, ips, 0, NULL, 0);

    if (! ret) {
            printf("match\n");
    } else {
            printf("no match\n");
    }

    return 0;
}

当我输入“1111111”并回车时,它会打印“y”。这似乎不对。

$ [name of compiled file]
comp
11111111
y
$ 

它还匹配更长的字符串;我还没过十点。

4

1 回答 1

2

你有一个逃避问题:

"^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"

目前,您将点转义一次,这使它们成为点(正则表达式点类型)。此外,您不需要转义花括号。

于 2013-04-19T07:55:26.800 回答