3

私のプログラムは、入力パラメータとしてIPアドレスのリストを含む文字列を取得します。各IPアドレスは改行で区切られます。これは次のようになります。

10.1.1.1
2.2.2.2
11.1.1.1

このように見えることがあります

10.1.1.1-20
1.1.1.1

しかし、それはこのように見えることができます

172.16.12.1-20 / 24
10.1.1.1

すべてのIPアドレスをチェックして、2つのリストvalidAddresses、invalidAddressesを返します。

私はすでに、最初の最も単純なタイプの入力、つまりIPアドレス範囲やネットワークマスクを処理しないプログラムを作成しました。

private String[] extractIPAddress(String address){
    String[] temp;
    temp = address.split("\\s+");
    return temp;
}

それから私はします

addressList = extractIPAddress(String.valueOf(value));

for (int i=0; i < addressList.length; i++) {
    if (InetAddresses.isInetAddress(addressList[i]) == true) {
        validAddress = validAddress.concat(addressList[i] + '\n');
    } else {
        invalidAddress = invalidAddress.concat(addressList[i] + '\n');
    }
}

今、私は最も複雑なタイプの入力、特にを処理する方法を考えています。

  • 回線に範囲が接続されている場合、メインIPアドレスを確認するためにパーツ1.1.1.1-10を削除する方法。範囲部分が有効なIPアドレスを作成する-10かどうかを確認する方法、つまりすべてをまとめる方法。これにより、最初と同じように、文字列の行として返すことができます。-101.1.1.10validAddress1.1.1.1-10

  • 同じ質問がネットワークマスクにも当てはまります/24

この種のプログラムにはどのような要素がありますか?概要を教えていただけますか?

私は次のことをやろうと思っていましたが、それが正しい方法であるかどうか、そしていくつかの部分を実装する方法がわかりません。

  • 見つけたら、行末または「/」-の位置から始まる部分を切り取ります(どうすればいいですか?)-
  • ipRangeその部分を変数に保存します
  • 見つけたら、の位置から行末まで/その部分を切り取ります/
  • netMaskその部分を変数に保存します
  • コンテンツをにコピーしますtmp_ipRange = ipRange
  • 変数-内のを削除しますtem_ipRange
  • tmp_ipRangeメインIPアドレスの最後のオクテットを(その方法は?)に置き換えます。
  • によって作成された配列に新しいIPアドレスを追加しますString.split()(Javaで配列に何かを追加することはできないため、不可能ですか?どのような代替手段がありますか?したがって、ここで分割を使用することはできませんか?)
  • (上記のコードを参照)をループしaddressList、IPアドレスが有効なIPアドレスであるかどうかを確認します
  • 検証後、そうでない場合はipRangeメインに追加します(メインが属するものを見つけるにはどうすればよいですか?)ipAddressipRangenullipAddressipRange
  • 検証後、そうでない場合はnetMaskeメインipAddress(および範囲)に追加します(メインが属するものを見つけるにはどうすればよいですか?)mainAddressnullipAddressnetMask
4

2 に答える 2

4

解析部分は正規表現で行うことができます。何かのようなもの:

final Pattern p = Pattern.compile(
    "(\\d+\\.\\d+\\.\\d+\\.\\d+)(?:-(\\d+))?(?:/(\\d+))?" );
for(String line : new String [] { "172.16.12.1-20/24",
                                  "172.16.12.1-20", 
                                  "172.16.12.1/24", 
                                  "172.16.12.1" })
{
    Matcher m = p.matcher(line);
    if (m.matches()) {
        String address = m.group(1);
        String rangePart = m.group(2); // is null if there is no range part
        String netmask = m.group(3); // is null if there is no netmask
        System.out.println(address + " - " + rangePart + " - " + netmask);
    }
}

編集:スペースを処理する必要がある場合は、次のように追加することで正規表現を拡張できます\\s*

"\\s*(\\d+\\.\\d+\\.\\d+\\.\\d+)(?:\\s*-\\s*(\\d+))?(?:\\s*/\\s*(\\d+))?\\s*"

このように、スペースを気にする必要はありません。

IPv6アドレスに対して同様の正規表現を作成することもできます。もちろん長くなりますが、原理は同じです。

于 2012-08-09T16:15:44.617 に答える
0

OK、このタスクに取り組むために次のコードを書きました。コードは期待どおりに機能しています。これは私の最初のJavaプログラムの1つなので、このコードに問題が発生するかどうか疑問に思っていました。

import java.util.*;
import java.lang.System;

import com.google.common.net.InetAddresses;

public class IPCheck{

  public static String[] extractLine(String line){
    String[] temp;
    temp = line.split("\\s+");

    return temp;
  }

  public static boolean hasNetMask(String line){
    boolean result = false;
    if(line.indexOf("/") != -1)
    result = true;

    return result;
  }

  public static boolean hasIPRange(String line){
    boolean result = false;
    if(line.indexOf("-") != -1)
    result = true;

    return result;
  }

  public static String extractNetMask(String line){
    String result = "";
    result = line.substring(line.indexOf("/"));

    return result;
  }

  public static String extractIPRange(String line){
    String result = "";
    result = line.substring(line.indexOf("-"));

    return result;
  }

  public static String chop(String line, String piece){
    String result = "";
    result = line.replace(piece, "");

    return result;
  }

  public static boolean validateIPRange(String ipRange){
    int tmpInt = 0;
    ipRange = chop(ipRange, "-");
    tmpInt = Integer.valueOf(ipRange);
    if(tmpInt > 255)
      return false;
    else
      return true;
  }

  public static void main(String args[]){
    String validIPAddress = "";
    String invalidIPAddress = "";
    String str = "10.1.1.1-300\n192.180.0.1-10/16\n192.168.0.1111";
    String[] addressList;
    String netMask = "";
    String ipRange = "";

    addressList = extractLine(str);
    for(int i=0; i<addressList.length; i++){

    if(hasNetMask(addressList[i]) == true){
      netMask = extractNetMask(addressList[i]);
      addressList[i] = chop(addressList[i], netMask);
    }

    if(hasIPRange(addressList[i]) == true){
      ipRange = extractIPRange(addressList[i]);
      addressList[i] = chop(addressList[i], ipRange);

       if(validateIPRange(ipRange) == false){
        /*if the IPRange is not valid, let's attach the ipRange
        to the current IP-Address to make it invalid*/
        addressList[i] = addressList[i].concat(ipRange);
        System.out.println( addressList[i]);
       }
    }

    if(InetAddresses.isInetAddress(addressList[i]) == true){
      validIPAddress = validIPAddress.concat(addressList[i] + ipRange + netMask);
    } else {
      invalidIPAddress = invalidIPAddress.concat(addressList[i] + ipRange + netMask);
    }
  }
 }
}
于 2012-08-12T20:15:35.883 に答える