2008-11-13 19 views
14

estoy usando esta simple expresión regular para validar una cadena hexadecimal:expresión regular para validar cadena hexadecimal

^[A-Fa-f0-9]{16}$ 

Como se puede ver, estoy usando un cuantificador para validar que la cadena es de 16 caracteres . Me preguntaba si puedo usar otro cuantificador en la misma expresión regular para validar que la longitud de la cuerda sea 16 o 18 (no 17).

Respuesta

50

creo

^([A-Fa-f0-9]{2}){8,9}$ 

va a funcionar.

Esto es bueno porque se generaliza a cualquier cadena de igual longitud.

+0

estoy de acuerdo que merece votos favorables –

+0

¡Buena idea! +1 – Tomalak

+0

Acepto, mejor: +1 (si Alonso quiere poner la marca de solución 'marcar' en esta respuesta en lugar de la mía, lo entendería;)) – VonC

5
^(?:[A-Fa-f0-9]{16}|[A-Fa-f0-9]{18})$ 
9

Eso es sólo un requisito de 16 caracteres con un carácter opcional 2 después:

^[A-Fa-f0-9]{16}([A-Fa-f0-9]{2})?$ 

pueden no ser necesarios los paréntesis - No soy lo suficientemente de un gurú de expresiones regulares para saber improviso, estoy asustado. Si alguien quiere modificarlo, no dude ...

+0

Desde el punto de vista del rendimiento, esto es * mucho * mejor. Mucho menos retrocediendo en un no-partido. +1 – Tomalak

+0

Se requieren paréntesis aquí. Si los omites, ¿el? hace que el {2} flojo, que no tiene ningún efecto aquí. –

0

probablemente me voy con

/^[a-f0-9]{16}([a-f0-9]{2})?$/i 

mí mismo. Creo que es más legible configurar las expresiones regulares como insensibles a mayúsculas y solo mostrar el rango de caracteres una vez. Dicho esto, casi todas estas respuestas funcionan.

+0

Como tantas otras cosas, es una compensación .../[a-f]/i puede ser más legible (o no, según el lector), pero// [A-Fa-f]/se ejecutará más rápido. Sin embargo, probablemente no haya suficiente diferencia de rendimiento para ser relevante en este caso. –

Cuestiones relacionadas