Regex para verificar que la cadena contenga solo caracteres hexadecimales

Resuelto pondigi asked hace 13 años • 3 respuestas

Nunca antes había hecho expresiones regulares y he visto que son muy útiles para trabajar con cadenas. Vi algunos tutoriales (por ejemplo) pero todavía no puedo entender cómo hacer una simple verificación de expresiones regulares de Java para caracteres hexadecimales en una cadena.

El usuario ingresará en el cuadro de texto algo como: 0123456789ABCDEFy me gustaría saber si la entrada fue correcta; de lo contrario, algo como XTYSPG456789ABCDEFcuando devuelva falso.

¿Es posible hacer eso con una expresión regular o no entendí bien cómo funcionan?

pondigi avatar Mar 16 '11 03:03 pondigi
Aceptado

Sí, puedes hacerlo con una expresión regular:

^[0-9A-F]+$

Explicación:

^ Inicio de línea.
[0-9A-F] Clase de carácter: Cualquier carácter del 0 al 9, o de la A a la F.
+ Cuantificador: Uno o más de los anteriores.
$ Fin de línea.

Para utilizar esta expresión regular en Java, puedes, por ejemplo, llamar al matchesmétodo en una cadena:

boolean isHex = s.matches("[0-9A-F]+");

Tenga en cuenta que matchessolo encuentra una coincidencia exacta, por lo que no necesita los anclajes de inicio y final de línea en este caso. Véalo funcionando en línea: ideone

Es posible que también quieras permitir AF en mayúsculas y minúsculas, en cuyo caso puedes usar esta expresión regular:

^[0-9A-Fa-f]+$
Mark Byers avatar Mar 15 '2011 20:03 Mark Byers

Es posible que desee utilizar la clase de caracteres POSIX \p{XDigit}, entonces:

^\p{XDigit}+$

Además, si planea utilizar la expresión regular con mucha frecuencia, se recomienda utilizar una constante para evitar tener que volver a compilarla cada vez, por ejemplo:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("^\\p{XDigit}+$");

public static void main(String[] args) {
    String input = "0123456789ABCDEF";
    System.out.println(
        REGEX_PATTERN.matcher(input).matches()
    );  // prints "true"
}
Paul Vargas avatar Feb 14 '2016 06:02 Paul Vargas

En realidad, la respuesta dada no es del todo correcta. El problema surge porque los números del 0 al 9 también son valores decimales. PARTE de lo que debe hacer es probar 00-99 en lugar de solo 0-9 para asegurarse de que los valores más bajos no sean números decimales. Al igual que:

^([0-9A-Fa-f]{2})+$

¡Decir que estos tienen que venir en pares! De lo contrario, ¡la cuerda es otra cosa! :-)

Ejemplo:

   (Pick one)
   var a = "1e5";
   var a = "10";
   var a = "314159265";

Si usara la respuesta aceptada en una expresión regular, devolvería VERDADERO.

   var re1 = new RegExp( /^[0-9A-Fa-f]+$/ );
   var re2 = new RegExp( /^([0-9A-Fa-f]{2})+$/ );

   if( re1.test(a) ){ alert("#1 = This is a hex value!"); }
   if( re2.test(a) ){ alert("#2 = This IS a hex string!"); }
     else { alert("#2 = This is NOT a hex string!"); }

Tenga en cuenta que el "10" devuelve VERDADERO en ambos casos. Si una cadena entrante solo tiene 0-9, NO puede saber fácilmente si es un valor hexadecimal o un valor decimal A MENOS que falte un cero delante de las cadenas fuera de longitud (los valores hexadecimales siempre vienen en pares, es decir, byte bajo/ byte alto). Pero valores como "34" son números decimales O hexadecimales perfectamente válidos. Simplemente significan dos cosas diferentes.

También tenga en cuenta que "3.14159265" no es un valor hexadecimal, sin importar qué prueba realice debido al período. Pero con la adición de "{2}" al menos te aseguras de que realmente sea una cadena hexadecimal en lugar de algo que PARECE una cadena hexadecimal.

Mark Manning avatar Nov 06 '2014 16:11 Mark Manning