我正在创建一个QLineEditor来手动输入十六进制格式的颜色。我想设置一个验证器来检查输入颜色是否是纯HUE颜色。
所有色调都遵循此模式,是X任意十六进制字符[从0-9或A-F]:
#FF00XX
#00FFXX
#00XXFF
#XX00FF
#XXFF00
#FFXX00
我设法检查了一个正确的HEX颜色值:^#([A-Fa-f0-9]{6})$
,但我不知道如何扩展验证器以只接受色调。
有什么想法吗?
您想要的模式是^#(?: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演示。
如果不希望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演示。
(?![fF]{2}|00)[a-fA-F0-9]{2}
部分匹配不等于FF
或00
的任意两个十六进制字符(不区分大小写(。
最简单的方法是只使用管道运算符来覆盖所有六种情况:
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
演示
显然,图案CCD_ 14被重复了几次。要删除冗余,可以将其保存在一个单独的变量中,并使用字符串格式替换它,形成如上所示的模式。
如果只有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)
演示