正则表达式匹配纯色相
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
显然模式 [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)
您想要的图案是^#(?: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
匹配 00
和 FF
,请将 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}
部分匹配任何两个不等于 FF
或 00
(不区分大小写)的十六进制字符。
我正在创建一个 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
显然模式 [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)
您想要的图案是^#(?: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
匹配 00
和 FF
,请将 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}
部分匹配任何两个不等于 FF
或 00
(不区分大小写)的十六进制字符。