2012-03-06 15 views
10

Estoy tratando de obtener los valores individuales de una cadena de rgb. Me he estado acercando, pero estoy golpeando una pared. Estoy mirando para hacer algo como esto:Expresión regular de Javascript para valores de rgb

var color = rgb(255, 85, 120); 

/// My Regex /// 
var rRegex = /^rgb\(\d{3}/; // Which actually gives me an array of two strings...ugh 
var gRegex = ; 
var bRegex = ; 

var r = color.match(rRegex); 
var g = color.match(gRegex); 
var b = color.match(bRegex); 

Sólo estoy tratando de tener:

/// // I think I can pull these off by Starts With and Ends With anchors... /// 
r = 'From "(" to "," '; 
g = 'From "," to "," '; 
b = 'From "," to ")" '; 

que estoy tratando de hacer también hacerlo de modo que la expresión regular puede tomar ya sea 1, 2 o 3 números, ya que los valores van de 0 a 255. ¡Gracias por cualquier ayuda!

+2

'/^rgb \ ((\ d +), (\ d +), (\ d +) \) $/' – Orbling

+0

Este parecía funcionar mejor, gracias, ¡Orbling! – cja

Respuesta

14

Aquí es un código de ejemplo que debe hacer aproximadamente lo que necesita o establecer que en la dirección correcta:

var color = 'rgb(255, 15, 120)'; 
var matchColors = /rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)/; 
var match = matchColors.exec(color); 
if (match !== null) { 
    document.write('Red: ' + match[1] + ' Green: ' + match[2] + ' Blue: ' + match[3]); 
} 

Se puede ver en acción aquí: http://jsfiddle.net/xonev/dRk8d/

+0

Nunca deja de sorprender. Gracias, Steven, ¡funcionó perfectamente! Y gracias por las respuestas increíblemente rápidas de todos los demás también. – cja

+0

Utilicé este código, pero utilicé la expresión regular de Orbling. Por alguna razón, funcionó mejor. Aunque no estoy seguro de por qué. Algunas veces su expresión regular no funcionaría, produciendo un nulo. Aún ayuda increíble, ¡gracias! – cja

+0

Las diferencias entre mi regex y Orbling son: Orbling's requiere que la definición de color sea la única en la cadena (tiene etiquetas de anclaje que coinciden con el principio y el final de la cadena), Orbling's permite números con más de 3 dígitos (solo el mío permite 1, 2 o 3 dígitos) y Orbling no permite espacios. De lo contrario, son muy similares. la expresión regular de arco puede ser la más general: permite cualquier espacio en blanco (o ningún) entre los números individuales, comas, etc. –

8

Prueba esta expresión regular:

/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/ 

se captará el valor r en $ 1, el valor de g en $ 2, y el valor de b en $ 3

5

Dada una cadena que es RGB válidos, números de analizar a cabo se trata de una cuestión de dígitos coincidentes:

"rgb(12, 34, 56)".match(/\d+/g); // ["12", "34", "56"] 
+0

¿Por qué eso no funciona con 'exec'? Devuelve solo '[" 0 "]' ... – yckart

+0

@yckart: Es una expresión regular global, por lo que necesita '.exec' varias veces. Cada carrera obtendrá la próxima partida. En este caso: 'var regexp =/\ d +/g; var r = regexp.exec (str) [0]; var g = regexp.exec (str) [0]; var b = regexp.exec (str) [0]; '. – pimvdb

0

^(\ d {1,2} | [1] [0-9] [0-9] | [2] [0- 5] [0-5]); (\ d {1,2} | [1] [0-9] [0-9] | [2] [0-5] [0-5]); (\ d {1,2} | [1] [0-9] [0-9] | [2] [0-5] [0-5]) $

formato x; x; x donde x es un número entre 0 (incluido) y 255 (incluido)

+0

Esto no permitiría 249 o valores similares. 250 está permitido y 255, pero no 2 [0-5] {6,7,8,9}. – EWit

7

I han llegado con este "^(rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$" que puede validar un montón entero de variaciones de cadena incluyendo:

  • rgb (255,255,255)
  • rgb (255, 255, 255) rgb (0/0/0)
  • rgb (50-50-50)
  • rgb (0 - 0 - 0)
  • rgb (255,0-50)
  • rgb (0, 255 255)
  • rgb (0 0 0)
  • 255.255.255
  • 255, 255, 0
  • (0, 0, 30)
  • (255 - 255 - 255)
  • rgb0 0 0
  • rgb255 - 0/255
0

probar esto. Una expresión regular dentro del rango 0 - 255.

rgb\(((*0*([1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]) *),){2}(*0*([1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]) *)\) 

Regular expression visualization

Debuggex Demo

1

I utilizar éste: rgb\(\s*(?:(?:\d{1,2}|1\d\d|2(?:[0-4]\d|5[0-5]))\s*,?){3}\)$

  • prefijo se rgb
  • al final tenemos {3} que significa que le cheques condiciones de debajo 3 veces

  • \d{1,2} si el valor en el interior tiene sólo 1 o 2 símbolos - comprobar si hay dígitos

  • 1\d\d si el valor en el interior tienen 3 dígitos y primero uno es igual a 1 y resto de ellos son dígitos

  • 2(?:[0-4]\d|5[0-5]) si el valor en el interior tienen 3 dígitos y primero es igual a 2 entonces
    • ?:[0-4]\d si segundo símbolo está en el rango de 0-4 la tercera uno debería cualquier dígito
    • 5[0-5] si segundo símbolo es igual a 5 entonces tercer símbolo debe ser dígitos de la gama 0-5
Cuestiones relacionadas