提取十六进制颜色代码需匹配以#开头、后跟3或6位十六进制字符的字符串,常用正则为#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}),支持大小写并用字边界避免误匹配。
要提取所有十六进制颜色代码(如 #ff5733、#abc、#a1b2c3),关键在于匹配以 # 开头、后跟 3 或 6 个十六进制字符(0–9、a–f、a–f)的字符串。
匹配标准十六进制颜色格式
最常见的 CSS 颜色写法是 #RRGGBB(6位)或简写 #RGB(3位)。正则表达式需同时覆盖这两种,并确保边界清晰,避免误匹配(如 #12345 或 #GGG)。
-
#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})—— 使用字边界防止匹配过长或粘连内容 - 若只想要纯 6 位(更严格),用
#([0-9a-fA-F]{6}) - 若允许带空格或紧跟标点(如
#FF0000;),可改用#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})(?=[s;,)\.]|$)做前瞻断言
处理大小写与重复匹配
十六进制字母不区分大小写,正则本身通过 a-fA-F 已兼容。但实际使用时建议开启忽略大小写标志(如 JavaScript 的 /i),简化模式:
- JavaScript 示例:
/#([0-9a-f]{3}|[0-9a-f]{6})/gi - Python 示例:
re.findall(r'#([0-9a-f]{3}|[0-9a-f]{6})', text, re.IGNORECASE) - 注意:
g(全局)和i(忽略大小写)标志能提升鲁棒性
排除干扰情况
实际文本中可能出现类似十六进制但非颜色的字符串(如哈希值 #a1b2c3d4、注释 # this is a comment),需针对性过滤:
- 避免匹配超过 6 位的哈希值:用
或(?![0-9a-f])确保后面不是十六进制字符 - 跳过行首注释:加负向先行断言
(?(慎用,依赖上下文) - 更稳妥做法是先提取,再按长度和上下文二次筛选(如只保留 3 或 6 位且前后无字母数字)
支持无 # 前缀的纯十六进制字符串
某些场景(如日志、数据字段)可能直接出现 FF5733 或 abc。此时去掉 # 并加强边界控制:
-
([0-9a-fA-F]{3}|[0-9a-fA-F]{6})—— 用字边界防止匹配123abc中的abc - 若需排除纯数字(如
123是十进制数而非 hex),可限定至少含一个字母:(?=[0-9a-fA-F]*[a-fA-F])[0-9a-fA-F]{3,6} - Python 中可用
re.findall(r'(?i)(?=[0-9a-f]*[a-f])[0-9a-f]{3,6}', text)

















