使用C中的regcomp()和regexec()函数进行正则表达式匹配

时间:2016-03-03 12:02:25

标签: c regex linux

在C语言上使用regex library并不熟悉。目前我正在尝试使用Regexec() and Regcomp()函数来搜索与我的模式或正则表达式匹配的字符串。但我不能生成我匹配的字符串。我错过了我的代码,或任何功能的故障使用?

我的示例代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <regex.h>

int main(int argc, char ** argv)
{
    regex_t r;
    const char * my_regex = "(\\d+.\\d+.\\d+.\\d+)";
    const char * my_string = "Am trying to match any ip like, 23.54.67.89 , in this string and 123.232.123.33 is possible";
    const int no_of_matches = 10;
    regmatch_t m[no_of_matches];

    printf ("Trying to match '%s' in '%s'\n", my_regex, my_string);
    int status = regcomp (&r, my_regex, REG_EXTENDED|REG_NEWLINE);
    printf("status: %d\n",status);
    if(status!=0)
    {
        printf ("Regex error compiling \n");
    }
    int match_size = regexec (&r, my_string, no_of_matches, m, 0);
    printf("Number of Matches : %d\n",match_size);
    int i = 0;
    for (i = 0; i < match_size; i++) 
    {
        //Now i wana print all matches here,
        int start = m[i].rm_so;
        int finish = m[i].rm_eo;
        printf("%.*s\n", (finish - start), my_string + start);
    }
    regfree (& r);
    return 0;
}

在这里,问题是:我无法打印我的比赛。有什么建议吗?我在linux上。 我已经编辑了我的for循环,现在打印出来了:

Trying to match '(\d+.\d+.\d+.\d+)' in 'Am trying to match any ip like, 23.54.67.89 , in this string and 123.232.123.33 is possible'
status: 0
Number of Matches : 1
m trying to match any ip like, 23.54.67.89 , in this string and 123.232.123.33 is possible

但我期待着我的出局:

Trying to match '(\d+.\d+.\d+.\d+)' in 'Am trying to match any ip like, 23.54.67.89 , in this string and 123.232.123.33 is possible'
status: 0
Number of Matches : 2
23.54.67.89
123.232.123.33

1 个答案:

答案 0 :(得分:2)

您的正则表达式不是POSIX正则表达式。你正在使用Perl / Tcl / Vim的味道,它不会像你希望的那样工作。

regcomp()regexec()POSIX regular expressions,因此是POSIX兼容(或仅POSIX-y)C库的一部分。它们不仅仅是一些正则表达式库的一部分;这些是POSIX标准的东西。

特别是,POSIX正则表达式无法识别\d或任何其他反斜杠字符类。您应该使用[[:digit:]]代替。 (字符类括在括号中,因此要匹配任何数字或小写字母,您可以使用[[:digit:][:lower:]]。对于除控制字符之外的任何内容,您可以使用[^[:cntrl:]]。)

一般情况下,您可以查看Character classes维基百科文章中的Regular expressions表格,其中包含带有说明的等效类的简明摘要。

您是否需要一个可识别区域设置的示例来演示此内容?