正则提取颜色代码需分别匹配hex(#abc、#abcd、#aabbcc、#aabbccdd)和rgb/rgba格式,注意边界符\b防误匹配、大小写不敏感及上下文限定,并建议分步提取与有效性验证。

正则提取颜色代码的关键是分别匹配 HEX(如 #ff0033、#fff)和 RGB(如 rgb(255, 0, 51)、rgba(255, 0, 51, 0.5))两种常见格式,注意边界和容错性。
匹配 HEX 颜色代码
HEX 格式支持 3 位(#abc)、4 位(带 alpha,如 #abcd)、6 位(#aabbcc)、8 位(#aabbccdd),且可带或不带 #。常用正则如下:
#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})\b- 用
\b防止匹配到更长的十六进制字符串(如#ff0033e中只取#ff0033) - 若只需标准 3/6 位,可用更严格的:
#([0-9A-Fa-f]{3}){1,2}\b
匹配 RGB / RGBA 颜色代码
RGB 类型需处理空格、逗号、小数点、百分比及可选 alpha 值。推荐兼顾可读性与健壮性的写法:
-
rgb\(?\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)?(基础 RGB) -
rgba\(?\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0?\.\d+|1(\.0+)?|\d{1,3}%?)\s*\)?(含 alpha) - 实际使用建议先统一用
rgb\(.*?\)或rgba\(.*?\)提取完整函数片段,再解析内部数值,避免正则过度复杂
一次性提取所有颜色(HEX + RGB/RGBA)
用分支 | 组合两类模式,并加非捕获组提升可维护性:
(?:#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})\b|rgb\(?\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)?|rgba\(?\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0?\.\d+|1(\.0+)?|\d{1,3}%?)\s*\)?)- 注意:多个捕获组会导致匹配结果结构松散,建议用命名捕获(如支持
(?P<hex>...)</hex>的语言)或分两轮提取 - 在 JavaScript 中推荐分开调用
match(),更易调试和转换为标准格式
实用建议与注意事项
真实文本中颜色常混杂在 CSS、内联样式或 JSON 中,需考虑上下文:
- 避免误匹配:如
margin: 10px中的10不是颜色;加词边界\b或前后空白/标点限定 - 忽略大小写:正则加
i标志(如/#([0-9a-f]{6})/i) - 预处理可提升准确率:先用
/style="[^"]*"/g提取 style 属性值,再对内容做颜色提取 - 验证有效性:提取后建议对 RGB 值检查是否 ≤255,HEX 是否长度合法,避免
#ggg这类无效值











