C语言正则验证主机名:正则正确却输出‘无匹配’问题
问题原因与解决方法
你的代码问题出在正则表达式编译的标志参数上:
- POSIX的
regcomp函数默认使用**基本正则表达式(BRE)语法,但你写的正则是扩展正则表达式(ERE)**格式,导致匹配逻辑不生效。 - 原代码缺少编译错误检查和资源释放步骤,无法及时排查潜在问题。
修改后的代码
#include <stdio.h> #include <regex.h> #include <stdlib.h> int main() { char *host = "www.google.es"; regex_t regex; char regularExpresion[] = "^(([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])$"; int ret; // 编译正则时指定使用扩展正则语法 ret = regcomp(®ex, regularExpresion, REG_EXTENDED); if (ret != 0) { char errbuf[128]; regerror(ret, ®ex, errbuf, sizeof(errbuf)); fprintf(stderr, "正则编译错误: %s\n", errbuf); return EXIT_FAILURE; } if(!regexec(®ex, host, 0, NULL, 0)) printf("Match"); else printf("No match"); // 释放正则资源,避免内存泄漏 regfree(®ex); return EXIT_SUCCESS; }
关键修改点
- 调用
regcomp时添加REG_EXTENDED标志,让编译器正确解析你写的扩展正则表达式语法。 - 增加
regcomp返回值检查,能快速定位正则编译阶段的语法错误(比如转义字符误用)。 - 匹配完成后调用
regfree释放regex_t结构体占用的系统资源。
内容的提问来源于stack exchange,提问作者Sergio Dacal Rodríguez
相关产品推荐
相关产品推荐

