3

間違ったリージョンからデータがキャプチャされています。eth0 ではなく eth1 から IP アドレス フィールドとサブネットをキャプチャしています。なぜこれが起こっているのかわかりません。私も試しmatcher.find(0)ましたが、同じ結果が得られました。

String[] dataNames = new String[]{"eth0Ip", "eth0Subnet"}
dataExtractionPattern = Pattern.compile("eth0 .*inet (?<eth0Ip>\\S+)  mask (?<eth0Subnet>\\S+)",Pattern.DOTALL);

Matcher matcher = dataExtractionPattern.matcher(receivedDataString);
if (matcher.find()) {
    for (String key : dataNames) {
        String dataValue;
        dataValue = matcher.group(key);
        extractedData.put(key, dataValue);
    }
    hasData = true;
}

入力文字列は次のとおりです。

lo0 リンク タイプ: ローカル ループバック キュー: なし
        inet 127.0.0.1 マスク 255.255.255.255
        アップランニングループバック
        MTU:1500 メトリック:1 VR:0
        RX パケット:4 mcast:0 エラー:0 ドロップ:1
        TX パケット:4 mcast:0 エラー:0
        衝突:0 サポートされていないプロト:0
        RX バイト:172 TX バイト:172

eth0 リンク タイプ: イーサネット HWaddr 00:25:f2:5e:9c:34 キュー: なし
        inet 10.1.2.2 マスク 10.1.2.1 ブロードキャスト 255.255.255.254
        放送中
        MTU:1000 メトリック:1 VR:0
        RX パケット:0 mcast:0 エラー:0 ドロップ:0
        TX パケット:0 mcast:0 エラー:0
        衝突:0 サポートされていないプロト:0
        RX バイト:0 TX バイト:0

eth1 リンク タイプ:イーサネット HWaddr 00:25:f2:5e:9c:33 キュー:なし
        inet 192.168.200.51 マスク 255.255.255.0 ブロードキャスト 192.168.200.255
        アップランニングブロードキャスト
        MTU:1500 メトリック:1 VR:0
        RX パケット:0 mcast:0 エラー:0 ドロップ:0
        TX パケット:0 mcast:0 エラー:0
        衝突:0 サポートされていないプロト:0
        RX バイト:0 TX バイト:0

eth0 ip の場合、192.168.200.51 とマスク 255.255.255.0 が誤ってキャプチャされます。

4

1 に答える 1

3

nhahtdh が述べたように、この.*部分は貪欲で、可能な限り一致します。パターンの残りの部分が続く最後の文字まですべてを意味します。

?量指定子の後にa を追加することで、一致する量指定子の動作を「欲張りでない/怠惰」に変更できます。

dataExtractionPattern = Pattern.compile("eth0 .*?inet (?<eth0Ip>\\S+)  mask (?<eth0Subnet>\\S+)",Pattern.DOTALL);

の最初の出現を見つけるために、これは可能な限り少ない一致になりますinet (?<eth0Ip>\\S+) mask (?<eth0Subnet>\\S+)

于 2013-01-07T07:19:56.157 に答える