如何识别给定的字符串是十六进制颜色格式


77

我正在寻找一个正则表达式来验证ASP.NET C#中的十六进制颜色,并且
还在寻找用于服务器端验证的代码。

例如: #CCCCCC

Answers:


161
^#(?:[0-9a-fA-F]{3}){1,2}$

解剖:

^              anchor for start of string
#              the literal #
(              start of group
 ?:            indicate a non-capturing group that doesn't generate backreferences
 [0-9a-fA-F]   hexadecimal digit
 {3}           three times
)              end of group
{1,2}          repeat either once or twice
$              anchor for end of string

这将匹配可在CSS中使用的任意十六进制颜色值,例如#91bf4a#f13

注意:不过,不支持RGBA十六进制颜色值。


1
我以为有效的颜色是3 * 1/2组合色...所以/ ^#(?:[0-9a-fA-F] {1,2}){3} $ /两种方法似乎都可行。
Michael Dausmann 2013年

4
@MichaelDausmann:不,您可以接受3到6个十六进制数字之间的任何数字。
乔伊

1
@Joey的逐步说明非常有帮助。谢谢
Karim

该正则表达式在创建示例程序时非常有用,我的公司使用该示例程序来吸引新开发人员。作为一个老派的Perl程序员,给我留下深刻印象的是,一些年轻的开发人员发现了更现代的编程语言中的前瞻性断言。看到在其他几个人的意见相同的正则表达式后,我终于决定google一下,看到他们刚刚想出如何SO搜索😅
文斯-

15

与其他解决方案略有不同。我会说

^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$

原因是(正确)捕获了各个RGB分量。另一个表达式将#112233分为三个部分,即“#” 112233。语法实际上是“#”(RR GG BB)|。(RGB)

轻微的缺点是需要更多的回溯。解析#CCC时,直到您击中字符串的末尾,您才知道第二个C是绿色分量。解析#CCCCCC时,直到看到第四个C,您才知道第二个C仍然是红色部分的一部分。


1
此正则表达式也将匹配#1234和#12345。但是,只能有3位或6位数字。此RE允许3到6位之间的任何数字。如果您确实想捕获正确的结构,则必须使用#([1-9a-fA-F]{3}|[1-9a-fA-F]{6})。如果要捕获各个颜色分量,它会变得更加复杂(您的建议也不能做到这一点)。
乔伊(Joey)

但是,出于纯粹的验证目的(即,一个值是否实际上是可能的和正确的值),我发现更容易查看字符串的外观结构,而不是指定的值。至少在这种情况下,所得的RE更简单。
乔伊(Joey)

2
@MSalters这仍然不太正确,因为它返回#FFFF的最后3位数字的匹配项。添加一组额外的括号:对其进行^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$修复。
克里斯,

确实,|没有将括号括起来,所以它寻找^#FFFFFFFFFF$。固定。
MSalters

([0-9a-fA-F]{2}){3}等于[0-9a-fA-F]{6}
chharvey

4

如果您也想接受命名的颜色和rgb(a,b,c),则使用此选项。最后的“ i”不区分大小写。

HTML颜色(#123,不接受RGB)

/^(#[a-f0-9]{6}|black|green|silver|gray|olive|white|yellow|maroon|navy|red|blue|purple|teal|fuchsia|aqua)$/i

CSS颜色(接受#123,RGB)

/^(#[a-f0-9]{6}|#[a-f0-9]{3}|rgb *\( *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *\)|rgba *\( *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *\)|black|green|silver|gray|olive|white|yellow|maroon|navy|red|blue|purple|teal|fuchsia|aqua)$/i

但html支持更多颜色,例如darkturquoise,lightgoldenrodyellow等
Mendon Ashwini,

1
@MendonAshwini是的。其中有140个是新的。您可以将它们全部写在regexp的末尾,以|分隔。
FrancescoMM

是的..我检查了drafts.c​​sswg.org/css-color-4。但这是改变它的明智方式吗?java是否提供任何库?
Mendon Ashwini '18 -4-5


3

根据MSalters的回答,但防止出现不正确的匹配,以下工作

^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$

或用于可选的哈希#符号:

^#?(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$

并且没有生成反向引用:

^#?(?:(?:[0-9a-fA-F]{2}){3}|(?:[0-9a-fA-F]){3})$

2

红宝石

在Ruby中,您可以访问\h(十六进制)字符类。您也可以采取行结尾的更多的照顾,因此,\A...\z而不是更常见^...$

/\A#(\h{3}){1,2}\z/

#后面将匹配3或6个十六进制字符。因此没有RGBA。即使没有i标志,它也不区分大小写。


1
在Ruby中,你也有/\H/相匹配的非六的字符,所以你只需要否定布尔(0非六字符发现正则表达式:它是有效的六数)例如:!"FF000"[/\H/] # true!"hello"[/\H/] # false
亚历克西斯德拉哈耶

1

这应该与任何#rgb#rgba#rrggbb,和#rrggbbaa语法:

/^#(?:(?:[\da-f]{3}){1,2}|(?:[\da-f]{4}){1,2})$/i

分解:

^            // start of line
#            // literal pound sign, followed by
(?:          // either:
  (?:          // a non-capturing group of:
    [\da-f]{3}   // exactly 3 of: a single digit or a letter 'a'–'f'
  ){1,2}       // repeated exactly 1 or 2 times
|            // or:
  (?:          // a non-capturing group of:
    [\da-f]{4}   // exactly 4 of: a single digit or a letter 'a'–'f'
  ){1,2}       // repeated exactly 1 or 2 times
)
$            // end of line
i            // ignore case (let 'A'–'F' match 'a'–'f')

请注意,以上内容等同于此语法,这是不正确的:

/^#(?:[\da-f]{3,4}){1,2}$/i

这将允许3个一组,然后是4个一组,例如#1234567,这不是有效的十六进制颜色。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.