^((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)来处理正则表达式。
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] = '