C的regexec匹配'1111111'到'^ [0-9] \ {1,3 \} \。[0-9] \ {1,3 \} \。[0-9] \ {1,3 \} \ [0-9] \ {1,3 \} $”

时间:2013-04-19 07:45:47

标签: c regex

以下代码是我作为独立测试编写的,用于我正在进行的大型项目的一部分;它应该以四重形式检测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'并按Enter键时,它会打印'y'。这似乎不对。

$ [name of compiled file]
comp
11111111
y
$ 

它也匹配更长的字符串;我没有超过十岁。

1 个答案:

答案 0 :(得分:2)

你有一个逃避问题:

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

此刻你一次逃脱你的点,这使得它们点(正则表达式点类)。此外,你不应该逃避花括号。