Je pense que cette solution est assez élégante, même s'il faut une minute pour la comprendre.
L'idée de base est de prendre une sous-chaîne de caractères et de la valider.
Veuillez noter que je permute x et y, puisque le début d'une sous-chaîne sera toujours la fin de la dernière plus 1.
Cette solution est environ 20 fois plus rapide qu'une variante de l'expression rationnelle et 2 fois plus rapide que le fractionnement.
public static boolean validIP(String ip) {
if(ip == null || ip.length() < 7 || ip.length() > 15) return false;
try {
int x = 0;
int y = ip.indexOf('.');
if (y == -1 || ip.charAt(x) == '-' || Integer.parseInt(ip.substring(x, y)) > 255) return false;
x = ip.indexOf('.', ++y);
if (x == -1 || ip.charAt(y) == '-' || Integer.parseInt(ip.substring(y, x)) > 255) return false;
y = ip.indexOf('.', ++x);
return !(y == -1 ||
ip.charAt(x) == '-' ||
Integer.parseInt(ip.substring(x, y)) > 255 ||
ip.charAt(++y) == '-' ||
Integer.parseInt(ip.substring(y, ip.length())) > 255 ||
ip.charAt(ip.length()-1) == '.');
} catch (NumberFormatException e) {
return false;
}
}
Si vous savez que vous aurez beaucoup de mauvaises IPs, pensez à ajouter le code suivant sous le premier if. Cela rendra le code 1,5 fois plus lent, mais en cas d'erreur, il sera multiplié par 700.
for (int i = 0; i < ip.length(); i++) {
if (!Character.isDigit(ip.charAt(i)) && ip.charAt(i) != '.') return false;
}