2014-07-07 3 views
-1

Je veux écrire un programme Java pour masquer des adresses IP spécifiques dans la chaîne d'entréejava Masque adresse IP

par exemple.

String input = "AAA192.10.*BBB10.92.*" 

Exigence: adresse IP de masque est 10.* il doit masquer toutes les adresses IP qui commencent par 10.

Donc la sortie devrait être AAA192.10.*BBBYYYYYYY (Il a remplacé chaque caractère de 10.92.* avec Y)

I besoin de faire correspondre la regex 10.* pour correspondre à toutes les adresses IP qui commencent par 10.

+0

L'entrée ... me semble bizarre. Qu'est-ce que c'est vraiment essayer de dénoter? – Makoto

+0

L'entrée consiste en une chaîne avec des adresses IP. J'ai besoin d'analyser la chaîne d'entrée et besoin de masquer l'adresse IP spécifique avec un certain caractère. – user3809619

+0

Votre question n'est pas claire. Je ne sais pas ce que vous définissez comme "masque" et quelle est votre entrée/sortie attendue – gerrytan

Répondre

0

Ne pas faire IP avec regex. Vous aurez presque toujours tort. Même lorsque vous avez la possibilité de faire les choses correctement, c'est dans des cas de petite taille que l'ensemble de l'exercice est inutile.

Par exemple, quelle est la regex à masquer 192.168.128.0/15? Rappelez-vous qu'avec ce modèle, 192.168.120.35 et 192.168.129.35 sont dans différents réseaux.

Il y a pire avec/14,/13,/12, etc.

Les gars OpenNMS ont fait quelque chose de semblable à ce que vous faites quelque temps, mais ils ont mis leur « matcher réseau » comme Fonction PostgreSQL. Il a dû être réécrit plusieurs fois pour l'enlever de ses racines regex et dans le monde moderne. Cela a causé plus de problèmes que cela n'a été corrigé.

Étant donné que Java est déjà disponible, utilisez les classes de mise en réseau Java. Ils sont beaucoup plus robustes que n'importe quelle solution regex que vous pourriez bricoler ensemble. Par exemple, vous pouvez voir comment déterminer si deux adresses se trouvent sur le même réseau.

public static boolean sameNetwork(InetAddress ip1, InetAddress ip2, String mask) 
throws Exception { 

    byte[] a1 = ip1.getAddress(); 
    byte[] a2 = ip2.getAddress(); 
    byte[] m = InetAddress.getByName(mask).getAddress(); 

    for (int i = 0; i < a1.length; i++) 
     if ((a1[i] & m[i]) != (a2[i] & m[i])) 
      return false; 

    return true; 

} 

(crédit à Óscar López) pour cet extrait

Toute tentative de faire la même chose avec regex va être beaucoup plus grande et beaucoup moins susceptibles d'être correct.