【发布时间】:2010-12-10 19:36:33
【问题描述】:
我正在寻找一个正则表达式来验证 ASP.NET C# 中的十六进制颜色和
我也在寻找服务器端验证的代码。
例如:#CCCCCC
【问题讨论】:
我正在寻找一个正则表达式来验证 ASP.NET C# 中的十六进制颜色和
我也在寻找服务器端验证的代码。
例如:#CCCCCC
【问题讨论】:
注意:这仅限于验证,即接受有效的十六进制颜色。对于实际的解析,您不会从中得到各个部分。
^#(?:[0-9a-fA-F]{3}){1,2}$
对于 ARGB:
^#(?:[0-9a-fA-F]{3,4}){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。
【讨论】:
与其他解决方案存在轻微分歧。我会说
^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$
原因是它(正确地)捕获了单个 RGB 分量。另一个表达式将#112233 分成三个部分,'#' 112 233。语法实际上是'#' (RR GG BB) | (R G B)
轻微的缺点是需要更多的回溯。解析 #CCC 时,您不知道第二个 C 是绿色组件,直到您到达字符串的末尾;解析#CCCCCC 时,您不知道第二个 C 仍然是红色组件的一部分,直到您看到第 4 个 C。
【讨论】:
#([1-9a-fA-F]{3}|[1-9a-fA-F]{6})。如果您想捕获单个颜色分量,它会变得更加复杂(您的建议也不会这样做)。
^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$ 修复它。
| 没有括起来,所以它寻找的是^#FFFFFFF 或FFF$。固定。
([0-9a-fA-F]{2}){3} 不等于 [0-9a-fA-F]{6}?
如果你也想接受命名颜色和 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
【讨论】:
基于 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})$
【讨论】:
所有答案都提到了 RGB 格式, 这是 ARGB 格式的正则表达式:
^#[0-9a-fA-F]{8}$|#[0-9a-fA-F]{6}$|#[0-9a-fA-F]{4}$|#[0-9a-fA-F]{3}$
【讨论】:
这应该匹配任何 #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,这不是有效的十六进制颜色。
【讨论】:
在 Ruby 中,您可以访问 \h(十六进制)字符类。您还必须更加注意行尾,因此 \A...\z 而不是更常见的 ^...$
/\A#(\h{3}){1,2}\z/
这将匹配 # 后面的 3 或 6 个十六进制字符。所以没有RGBA。尽管没有 i 标志,但它也不区分大小写。
【讨论】:
/\H/ 匹配非十六进制字符,所以你只需要否定布尔值(正则表达式找到 0 个非六进制字符:它是有效的十六进制数)例如:!"FF000"[/\H/] # true , !"hello"[/\H/] # false