c正则判断ip和域名
- 行业动态
- 2025-02-22
- 1
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
用于匹配IP地址。
在C语言中,使用正则表达式判断IP和域名是一个常见的需求,以下将详细解释如何使用正则表达式来实现这一功能,并提供相应的示例代码。
一、正则表达式介绍
正则表达式是一种用于匹配字符串模式的工具,它可以用来检查一个字符串是否符合某个特定的格式,在C语言中,可以使用POSIX正则表达式库(regex.h)来处理正则表达式。
二、IP地址的正则表达式
IPv4地址由四个十进制数字组成,每个数字的取值范围是0到255,数字之间用点号分隔,192.168.1.1,为了匹配这种格式,可以使用以下正则表达式:
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(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]?)
匹配一个0到255之间的数字。
25[0-5]
匹配250到255。
2[0-4][0-9]
匹配200到249。
[01]?[0-9][0-9]?
匹配0到199,这里[01]?
表示可选的第一位数字,[0-9][0-9]?
表示第二位和第三位数字。
.
匹配点号。
{3}
表示前面的模式重复三次,即匹配三个点号分隔的数字组。
三、域名的正则表达式
域名通常由字母、数字和连字符组成,并且可以包含多个级别,www.example.com,为了匹配这种格式,可以使用以下正则表达式:
^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?.)+[a-zA-Z]{2,}$
这个表达式的解释如下:
^
表示字符串的开始。
[a-zA-Z0-9]
匹配字母或数字。
([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?
匹配一个可选的子域名部分,
[a-zA-Z0-9-]{0,61}
匹配最多61个字母、数字或连字符。
[a-zA-Z0-9]
确保子域名不以连字符结束。
.
匹配点号。
+
表示前面的模式至少重复一次,即匹配至少一个子域名部分。
[a-zA-Z]{2,}
匹配顶级域名,至少包含两个字母。
$
表示字符串的结束。
四、示例代码
下面是一个使用C语言和POSIX正则表达式库来判断输入字符串是否为有效的IP地址或域名的示例代码:
#include <stdio.h> #include <stdlib.h> #include <regex.h> int is_valid_ip(const char *str) { regex_t regex; int reti; char msgbuf[100]; reti = regcomp(®ex, "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", REG_EXTENDED); if (reti) { fprintf(stderr, "Could not compile regex: %s ", regerror(reti, ®ex, msgbuf, sizeof(msgbuf))); return 0; } reti = regexec(®ex, str, 0, NULL, 0); regfree(®ex); if (!reti) { return 1; } else if (reti == REG_NOMATCH) { return 0; } else { char msgbuf[100]; regerror(reti, ®ex, msgbuf, sizeof(msgbuf)); fprintf(stderr, "Regex match failed: %s ", msgbuf); return 0; } } int is_valid_domain(const char *str) { regex_t regex; int reti; char msgbuf[100]; reti = regcomp(®ex, "^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$", REG_EXTENDED); if (reti) { fprintf(stderr, "Could not compile regex: %s ", regerror(reti, ®ex, msgbuf, sizeof(msgbuf))); return 0; } reti = regexec(®ex, str, 0, NULL, 0); regfree(®ex); if (!reti) { return 1; } else if (reti == REG_NOMATCH) { return 0; } else { char msgbuf[100]; regerror(reti, ®ex, msgbuf, sizeof(msgbuf)); fprintf(stderr, "Regex match failed: %s ", msgbuf); return 0; } } int main() { char input[100]; printf("Enter a string to validate: "); fgets(input, sizeof(input), stdin); // Remove newline character if present size_t len = strlen(input); if (len > 0 && input[len 1] == ' ') { input[len 1] = '