C中使用正則表達式
在C語言中使用正則表達式也是件很簡單的事,但真正會用的人好像很少啊真是遺憾。其實應用正則表達式判斷一些格式的合法性非常方便。下面就舉幾個例子先睹爲快。
本文例子都經過測試可放心使用。
正則表達式封裝
我們不必關心正則引擎的打開關閉等,因此把相關操作封裝到一個函數中,實現如下:
注:使用正則表達式時需要包含頭文件(#include <regex.h>)
/**
* 判斷字符串是否滿足正則表達式
* regex_pattern: 正則表達式
* to_match: 待匹配正則表達式的字符串
* 返回值: -1 不匹配
* 0 匹配
*/
int regex_exe(const char *regex_pattern, const char *to_match)
{
regex_t r;
int ret;
int match;
char errmsg[128];
if(regcomp(&r, regex_pattern, REG_EXTENDED | REG_NEWLINE)) {
printf("regcomp failed!\n");
regfree(&r);
return -1;
}
ret = regexec(&r, to_match, 0, NULL, 0);
if(!ret) {
match = 1;
printf("match!\n");
} else if(ret == REG_NOMATCH) {
match = 0;
printf("not match!\n");
} else {
regerror(ret, &r, errmsg, sizeof(errmsg));
printf("regexec failed: %s!\n", errmsg);
regfree(&r);
return -1;
}
regfree(&r);
return match;
}
有了這個函數,我們就可以根據學過的正則表達式知識,完成IP/MAC/DNS等的校驗了。
IP地址校驗
int check_ip(const char *ip)
{
int match;
const char validIpAddress[] = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";
match = regex_exe(validIpAddress, ip);
if(match != 1) {
return -1;
}
return 0;
}
int check_mac(const char *mac)
{
int match;
const char validMacAddress[] = "^([a-fA-F0-9]{2}:){5}([a-fA-F0-9]{2})$";
printf("%s\n", mac);
match = regex_exe(validMacAddress, mac);
if(match != 1) {
return -1;
}
return 0;
}
int check_dns(const char *dns)
{
int match;
const char validDnsRegex[] = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$";
printf("%s\n", dns);
match = regex_exe(validDnsRegex, dns);
if(match != 1) {
return -1;
}
return 0;
}
最後