C中的正则表达式

时间:2011-07-04 10:12:01

标签: c# c regex

我正在尝试在C中进行一些正则表达式匹配,现在正在进行IP地址匹配。

在c#中,我会选择这样的模式:

//Doesn't matter if not a correct IP, or just 4 groups of 3 digits separated string
string pattern = @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}";

在C中,略有修改的模式,它似乎没有给出任何结果,所以我想有另一种表示正则表达式用于regcompregexec的方法。

C中正确的正则表达式与IP地址匹配是什么?对优秀教程的引用也很不错。

修改:这是我的代码的摘录

..
#include <regex.h>
..

int main(int argc, char *argv[]){
        regex_t regex;
        int reti;

        char* pattern = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";
        reti = regcomp(&regex, pattern, 0);
        if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); }

        reti = regexec(&regex, "21.21.12.12", 0, NULL, 0);
        if( !reti ){
                puts("Match");
        }
        else
                puts("No match");

        return 0;
}

编辑2 :解决方法是使用POSIX括号表达as explained here

3 个答案:

答案 0 :(得分:1)

而不是\ d你必须使用[0-9]或者[:digit:],并且应该支持{}语法,所以其余部分可以是ketp,据我所知。如果不是,请考虑使用PCRE而不是“默认”正则表达式(在这种情况下,您不需要更改在C#中执行的操作)

答案 1 :(得分:0)

解决方案:More about POSIX Bracket Expressions

int main(int argc, char *argv[]){
        regex_t regex;
        int reti;
        char msgbuf[100];

    /*pattern to match IPv4 ip adresses*/
        char* pattern = "[[:alnum:]]{1,3}\\.[[:alnum:]]{1,3}\\.[[:alnum:]]{1,3}\\.[[:alnum:]]{1,3}";

        /* Compile regular expression */

        reti = regcomp(&regex, pattern, REG_EXTENDED);
        if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); }

        /* Execute regular expression */
        reti = regexec(&regex, "2.3.4.5", 0, NULL, 0);
        if( !reti ){
                puts("Match");
        }
        else if( reti == REG_NOMATCH ){
                puts("No match");
        }
        /* Free compiled regular expression if you want to use the regex_t again */
    regfree(&regex);

        return 0;
}

答案 2 :(得分:-1)

您可以使用以下正则表达式模式:

string pattern = "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b";