C语言regcomp无法编译base64字符串匹配正则表达式问题
问题原因
你使用的(?=)正向预查语法属于PCRE正则专属特性,POSIX标准的regex.h库不支持该语法,无论是基础正则还是扩展正则模式下都会触发编译错误。
解决方法
方法一:修改为POSIX兼容的正则表达式
按照Base64的编码规则:总长度为4的整数倍、仅允许字母、数字、+、/字符、末尾最多2个=填充符,可直接拆分匹配场景,去掉预查逻辑,兼容POSIX扩展正则的写法如下:^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$
修改后的运行代码:
#include <stdio.h> #include <regex.h> int main() { const char *data = "dGVzdHRlc3Q="; regex_t regex; int ret = regcomp(®ex, "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$", REG_EXTENDED); if (ret) { printf("Could not compile regex\n"); return 1; } ret = regexec(®ex, data, 0, NULL, 0); if (!ret) printf("Match\n"); else if (ret == REG_NOMATCH) printf("No match\n"); regfree(®ex); return 0; }
方法二:使用OpenSSL内置Base64校验接口(更推荐)
由于你环境允许使用OpenSSL相关库,无需自己手写正则做匹配,直接调用OpenSSL的Base64解码接口即可同时完成格式校验和解码操作,准确性远高于正则匹配。
参考实现逻辑:
#include <openssl/bio.h> #include <openssl/evp.h> #include <string.h> int is_valid_base64(const char *data) { BIO *bio, *b64; char buffer[1024]; int len = strlen(data); b64 = BIO_new(BIO_f_base64()); bio = BIO_new_mem_buf(data, len); bio = BIO_push(b64, bio); BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); int decode_len = BIO_read(bio, buffer, len); BIO_free_all(bio); return decode_len > 0; }
编译时需要添加-lcrypto参数链接OpenSSL加密库。
内容的提问来源于stack exchange,提问作者weyh
相关产品推荐
相关产品推荐

