3

正在从错误的区域捕获数据。它从 eth1 而不是 eth0 捕获 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 回答