2009-10-28 14 views

Respuesta

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

Disección:

^    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 

Este coincidirá con un valor de color hexadecimal arbitrario que puede ser usado en CSS, como #91bf4a o #f13.

Nota: Sin embargo, no admite valores de color hexadecimal RGBA.

+1

pensé que era de color válido 3 * un combo medio ... así/^ # (?: [0-9a-fA-F] {1,2}) {3} $/Ambas formas parecen funcionar. –

+4

@MichaelDausmann: No, los tuyos aceptarían cualquier cosa entre 3 y 6 dígitos hexadecimales. – Joey

+1

@Joey muy útil la explicación paso a paso. gracias – Karim

13

Desacuerdo menor con la otra solución. Yo diría

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

La razón es que esto (correctamente) captura los componentes RGB individuales. La otra expresión se rompió # 112233 en tres partes, '#' 112 233. La sintaxis es en realidad '#' (RR GG BB) | (R G B)

La desventaja leve es que se requiere más retroceso. Al analizar #CCC, no sabes que la segunda C es el componente verde hasta que tocas el final de la cadena; al analizar #CCCCCC usted no sabe que la segunda C es todavía parte del componente rojo hasta que vea el cuarto C.

+1

Esta expresión regular también coincidiría con # 1234 y # 12345. Sin embargo, solo puede haber 3 dígitos o 6 dígitos. Esta RE permite cualquier cosa entre 3 y 6 dígitos. Si realmente deseaba capturar la estructura correcta, entonces tendría que usar '# ([1-9a-fA-F] {3} | [1-9a-fA-F] {6})'. Si desea capturar los componentes de color individuales, se vuelve más complejo (su sugerencia tampoco lo hace). – Joey

+0

Pensándolo bien, tienes razón, arreglándolo. – MSalters

+0

Para fines de validación pura (p.si un valor es realmente uno posible y correcto), sin embargo, me resulta más fácil observar la estructura aparente de la cadena y no la especificada. Al menos en este caso, el RE resultante es más simple. – Joey

3

Esto si desea aceptar y colores rgb con nombre (a, b, c) también. La "i" final es para mayúsculas y minúsculas.

colores HTML (# 123, rgb no aceptada)

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

colores CSS (# 123, rgb aceptada)

/^(#[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 
2

Basado en respuesta MSalters', pero la prevención de una coincidencia incorrecta, los siguientes trabajos

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

O para un hash # símbolo opcional: se generan

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

Y sin referencias anteriores:

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