Regex para verificar que la cadena contenga solo caracteres hexadecimales
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: 0123456789ABCDEF
y me gustaría saber si la entrada fue correcta; de lo contrario, algo como XTYSPG456789ABCDEF
cuando devuelva falso.
¿Es posible hacer eso con una expresión regular o no entendí bien cómo funcionan?
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 matches
método en una cadena:
boolean isHex = s.matches("[0-9A-F]+");
Tenga en cuenta que matches
solo 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]+$
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"
}
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.