2014-07-07 152 views
-1

我想編寫一個java程序來掩蓋輸入字符串中的特定ip地址。java掩碼ip地址

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

要求:IP地址掩碼是10.*所以應該掩蓋與10.

所以輸出應該是AAA192.10.*BBBYYYYYYY開始的所有IP地址(它取代Y10.92.*每個字符)

我需要匹配正則表達式10.*以匹配以10.

+0

輸入...對我來說似乎很奇怪。它真的試圖表示什麼? – Makoto

+0

輸入由字符串和IP地址組成。我需要解析輸入字符串,並需要用某些字符來掩飾特定的IP地址。 – user3809619

+0

你的問題不清楚。我不知道你定義的「掩碼」和你期望的輸入/輸出 – gerrytan

回答

0

開頭的所有IP地址不要做IP與正則表達式。你幾乎總是弄錯了。即使你有可能做出正確的選擇,但在這樣的小角落案例中,整個練習都是毫無意義的。

例如,掩碼192.168.128.0/15的正則表達式是什麼?請記住,在這種模式下,192.168.120.35和192.168.129.35位於不同的網絡中。

它得到與/ 14更糟的是,/ 13,/ 12等

在OpenNMS的的鄉親做類似於你在做什麼了一段時間回來的東西,雖然他們實現自己的「網絡匹配」作爲PostgreSQL函數。它必須被重寫幾次,才能從它的正則表達式根植到現代世界中。它造成的問題比修正更多。

由於您已經有Java,所以請使用Java網絡類。它們比任何可以拼湊在一起的正則表達式解決方案都強大得多。例如,你可以看看如何確定兩個地址是否在同一個網絡中。

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; 

} 

(信用奧斯卡·洛佩斯)對這個片段

任何企圖做正則表達式同樣將是大得多且不太可能是正確的。