当前位置:首页 > 行业动态 > 正文

c正则判断ip和域名

使用正则表达式可判断IP和域名,如: ^((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(&regex, "^((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, &regex, msgbuf, sizeof(msgbuf)));
        return 0;
    }
    reti = regexec(&regex, str, 0, NULL, 0);
    regfree(&regex);
    if (!reti) {
        return 1;
    } else if (reti == REG_NOMATCH) {
        return 0;
    } else {
        char msgbuf[100];
        regerror(reti, &regex, 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(&regex, "^([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, &regex, msgbuf, sizeof(msgbuf)));
        return 0;
    }
    reti = regexec(&regex, str, 0, NULL, 0);
    regfree(&regex);
    if (!reti) {
        return 1;
    } else if (reti == REG_NOMATCH) {
        return 0;
    } else {
        char msgbuf[100];
        regerror(reti, &regex, 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] = '
0