正则表达式匹配纯色相

QRegEx to match a pure hue color

我正在创建一个 QLineEditor 来手动输入十六进制格式的颜色。我想设置一个验证器来检查输入颜色是否是纯 HUE 颜色。

所有色调都遵循此模式,X 是任何十六进制字符 [从 0-9 或 A-F]:

#FF00XX
#00FFXX
#00XXFF
#XX00FF
#XXFF00
#FFXX00

我设法检查了正确的 HEX 颜色值:^#([A-Fa-f0-9]{6})$,但我不知道如何扩展验证器以仅接受色调颜色。

有什么想法吗?

最简单的方法是只使用管道运算符来涵盖所有六种情况:

00[A-Fa-f0-9]{2}FF|00FF[A-Fa-f0-9]{2}|FF00[A-Fa-f0-9]{2}|FF[A-Fa-f0-9]{2}00|[A-Fa-f0-9]{2}00FF|[A-Fa-f0-9]{2}FF00

Demo

显然模式 [A-Fa-f0-9]{2} 重复了几次。要去除冗余,您可以将其保存在一个单独的变量中,并使用字符串格式替换它并形成如上所示的模式。

如果只有 6 个案例,您可以使用布尔 OR (|)

编写此案例

(?<=#00FF|#FF00)[A-Fa-f0-9]{2}|[A-Fa-f0-9]{2}(?=00FF|FF00)|(?<=#00)[A-Fa-f0-9]{2}(?=FF)|(?<=#FF)[A-Fa-f0-9]{2}(?=00)

Demo

您想要的图案是^#(?:00(?:FFXX|XXFF)|FF(?:00XX|XX00)|XX(?:00FF|FF00))$

如果您希望 XX 为任何十六进制字符,请替换为 [a-fA-F0-9]{2}。然后,正则表达式看起来像

^#(?:00(?:FF[a-fA-F0-9]{2}|[a-fA-F0-9]{2}FF)|FF(?:00[a-fA-F0-9]{2}|[a-fA-F0-9]{2}00)|[a-fA-F0-9]{2}(?:00FF|FF00))$

参见regex demo

如果您不希望 XX 匹配 00FF,请将 XX 替换为 (?![fF]{2}|00)[a-fA-F0-9]{2}。然后,正则表达式看起来像

^#(?:00(?:FF(?![fF]{2}|00)[a-fA-F0-9]{2}|(?![fF]{2}|00)[a-fA-F0-9]{2}FF)|FF(?:00(?![fF]{2}|00)[a-fA-F0-9]{2}|(?![fF]{2}|00)[a-fA-F0-9]{2}00)|(?![fF]{2}|00)[a-fA-F0-9]{2}(?:00FF|FF00))$

参见regex demo

(?![fF]{2}|00)[a-fA-F0-9]{2} 部分匹配任何两个不等于 FF00(不区分大小写)的十六进制字符。