我正在尝试在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中,略有修改的模式,它似乎没有给出任何结果,所以我想有另一种表示正则表达式用于regcomp
和regexec
的方法。
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(®ex, pattern, 0);
if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); }
reti = regexec(®ex, "21.21.12.12", 0, NULL, 0);
if( !reti ){
puts("Match");
}
else
puts("No match");
return 0;
}
编辑2 :解决方法是使用POSIX括号表达as explained here
答案 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(®ex, pattern, REG_EXTENDED);
if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); }
/* Execute regular expression */
reti = regexec(®ex, "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(®ex);
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";