如何在C++中使用正则表达式将十六进制颜色字符串转换为RGB值
十六进制颜色字符串转RGB值的正则实现问题修正
原代码错误原因
- 正则分组捕获逻辑错误:你当前写的
#?([0-9a-fA-F]{2}){3}中,重复量词{3}作用在单个分组外,C++正则只会保留该分组最后一次匹配的结果,也就是仅能拿到B通道的00,match[2]、match[3]两个分组不存在,运行时会拿到空值或直接崩溃。 - 正则未做明确的格式约束,极端情况下会匹配到不符合规则的字符串。
修正方案
把三个颜色通道的捕获组分开写,分别对应R、G、B三个通道,同时可开启正则大小写不敏感标记简化写法:
#include <iostream> #include <string> #include <regex> #include <cstdint> int main() { std::string l_strHexValue = "#FF0000"; // 三个分组分别捕获R、G、B通道,开启大小写不敏感匹配 std::regex pattern("#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})", std::regex::icase); std::smatch match; if (std::regex_match(l_strHexValue, match, pattern)) { uint8_t r = static_cast<uint8_t>(std::stoi(match[1].str(), nullptr, 16)); uint8_t g = static_cast<uint8_t>(std::stoi(match[2].str(), nullptr, 16)); uint8_t b = static_cast<uint8_t>(std::stoi(match[3].str(), nullptr, 16)); // 测试输出 std::cout << "R:" << static_cast<int>(r) << " G:" << static_cast<int>(g) << " B:" << static_cast<int>(b) << std::endl; } return 0; }
修正后运行可得到正确结果:R:255 G:0 B:0
可选扩展
如果需要支持#FFF这类3位简写的十六进制颜色,可以调整正则为#?([0-9a-f])([0-9a-f])([0-9a-f]),匹配后把每个字符重复一次再转数值即可,比如F转为FF对应255。
内容的提问来源于stack exchange,提问作者sas
相关产品推荐
相关产品推荐

