Je n'ai jamais fait de regex auparavant, et j'ai vu qu'ils sont très utiles pour travailler avec des chaînes. J'ai vu quelques tutoriels (par exemple) mais je ne comprends toujours pas comment faire un simple Java regex vérifier les caractères hexadécimaux dans une chaîne.
L'utilisateur saisira dans la zone de texte quelque chose comme: 0123456789ABCDEF
et je voudrais savoir que l'entrée était correcte sinon si quelque chose comme XTYSPG456789ABCDEF
en cas de retour faux.
Est-il possible de le faire avec une expression régulière ou ai-je mal compris comment ils fonctionnent?
Oui, vous pouvez le faire avec une expression régulière:
^ [0-9A-F] + $
Explication:
^ Début de ligne. [0-9A-F] Classe de caractères: Tout caractère compris entre 0 et 9, ou entre A et F. + Quantificateur: un ou plusieurs des $ Fin de ligne.
Pour utiliser cette expression régulière dans Java vous pouvez par exemple appeler la méthode matches
sur une chaîne:
boolean isHex = s.matches("[0-9A-F]+");
Notez que matches
ne trouve qu'une correspondance exacte, vous n'avez donc pas besoin des ancres de début et de fin de ligne dans ce cas. Voir le fonctionnement en ligne: ideone
Vous pouvez également autoriser à la fois les majuscules et les minuscules A-F, auquel cas vous pouvez utiliser cette expression régulière:
^ [0-9A-Fa-f] + $
Vous souhaitez peut-être utiliser la classe de caractères POSIX \p{XDigit}
, donc:
^\p{XDigit}+$
De plus, si vous prévoyez d'utiliser l'expression régulière très souvent, il est recommandé d'utiliser une constante afin d'éviter de la recompiler à chaque fois, par exemple:
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 fait, la réponse donnée n'est pas totalement correcte. Le problème se pose car les nombres 0-9 sont également des valeurs décimales. Une partie de ce que vous devez faire est de tester 00-99 au lieu de seulement 0-9 pour vous assurer que les valeurs inférieures ne sont pas des nombres décimaux. Ainsi:
^([0-9A-Fa-f]{2})+$
Pour dire ceux-ci doivent venir par paires! Sinon - la chaîne est autre chose! :-)
Exemple:
(Pick one)
var a = "1e5";
var a = "10";
var a = "314159265";
Si j'utilisais la réponse acceptée dans une expression régulière, elle retournerait VRAI.
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!"); }
Notez que le "10" renvoie VRAI dans les deux cas. Si une chaîne entrante n'a que 0-9, vous ne pouvez PAS le dire, facilement s'il s'agit d'une valeur hexadécimale ou d'une valeur décimale À MOINS QU'il y ait un zéro manquant devant les chaînes de longueur hors tension (les valeurs hexadécimales viennent toujours par paires - c'est-à-dire - octet bas/octet haut). Mais des valeurs comme "34" sont toutes deux décimales parfaitement valides OR nombres hexadécimaux. Ils signifient simplement deux choses différentes.
Notez également que "3.14159265" n'est pas une valeur hexadécimale quel que soit le test que vous effectuez en raison de la période. Mais avec l'ajout du "{2}", vous vous assurez au moins qu'il s'agit bien d'une chaîne hexadécimale plutôt que de quelque chose qui AIME comme une chaîne hexadécimale.