Java 为什么在我的正则表达式中从错误的区域捕获组?(爪哇7)

Java 为什么在我的正则表达式中从错误的区域捕获组?(爪哇7),java,regex,Java,Regex,正在从错误的区域捕获数据。它从eth1而不是eth0捕获ip地址字段和子网。我不明白为什么会这样。我还尝试了matcher.find(0),但得到了相同的结果 String[] dataNames = new String[]{"eth0Ip", "eth0Subnet"} dataExtractionPattern = Pattern.compile("eth0 .*inet (?<eth0Ip>\\S+) mask (?<eth0Subnet>\\S+)",Patt

正在从错误的区域捕获数据。它从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;
}
String[]dataNames=新字符串[]{“eth0Ip”,“eth0Subnet”}
dataExtractionPattern=Pattern.compile(“eth0.*inet(?\\S+)掩码(?\\S+),Pattern.DOTALL);
Matcher Matcher=dataExtractionPattern.Matcher(receivedDataString);
if(matcher.find()){
for(字符串键:数据名){
字符串数据值;
数据值=匹配器组(键);
extractedData.put(键、数据值);
}
hasData=true;
}
输入字符串为:

lo0 Link type:Local loopback Queue:none inet 127.0.0.1 mask 255.255.255.255 UP RUNNING LOOPBACK MTU:1500 metric:1 VR:0 RX packets:4 mcast:0 errors:0 dropped:1 TX packets:4 mcast:0 errors:0 collisions:0 unsupported proto:0 RX bytes:172 TX bytes:172 eth0 Link type:Ethernet HWaddr 00:25:f2:5e:9c:34 Queue:none inet 10.1.2.2 mask 10.1.2.1 broadcast 255.255.255.254 RUNNING BROADCAST MTU:1000 metric:1 VR:0 RX packets:0 mcast:0 errors:0 dropped:0 TX packets:0 mcast:0 errors:0 collisions:0 unsupported proto:0 RX bytes:0 TX bytes:0 eth1 Link type:Ethernet HWaddr 00:25:f2:5e:9c:33 Queue:none inet 192.168.200.51 mask 255.255.255.0 broadcast 192.168.200.255 UP RUNNING BROADCAST MTU:1500 metric:1 VR:0 RX packets:0 mcast:0 errors:0 dropped:0 TX packets:0 mcast:0 errors:0 collisions:0 unsupported proto:0 RX bytes:0 TX bytes:0 lo0链接类型:本地环回队列:无 inet 127.0.0.1掩码255.255.255.255 上行环回 MTU:1500公制:1 VR:0 接收数据包:4 mcast:0错误:0丢弃:1 发送数据包:4 mcast:0错误:0 冲突:0不支持的协议:0 接收字节:172发送字节: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 接收数据包:0 mcast:0错误:0丢弃:0 发送数据包:0 mcast:0错误:0 冲突:0不支持的协议:0 接收字节:0发送字节: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 接收数据包:0 mcast:0错误:0丢弃:0 发送数据包:0 mcast:0错误:0 冲突:0不支持的协议:0 接收字节:0发送字节:0
对于eth0ip,它错误地捕获了192.168.200.51和掩码255.255.255.0

正如nhahdh所提到的,
*
部分是贪婪的,将尽可能匹配,意味着所有内容,直到模式的其余部分跟随的最后一个字符为止

通过在量词后添加
,可以将量词的匹配行为更改为“ungreedy/lazy”:

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

这将尽可能少地匹配,因此您会发现第一次出现的
inet(?\\S+)掩码(?\\S+)

*
是贪婪的,因此它将尽可能多地消耗,并溢出到eth1的条目中。它没有回答您的问题,但您知道可以通过编程方式获取此信息吗@NHAHDH谢谢,改为不情愿的量词确实有效。@SimonC我必须从设备响应命令返回的响应文本中解析并提取字段。该设备已连接到电脑的串行端口。@nhatdh谢谢大家。成功了。我有一个后续问题。试着去拿MTU,我发现了`.*?MTU:`失败了。我不得不删除空格并使用
*?MTU:
为什么?输入字符串中有空格。是否使用Matcher.matches()与Matcher.find()使用相同的推理?看起来matches()是贪婪的,但find()是不情愿的。@Anil,1。那么它不是字符串中的空格。也许是账单?2.该方法不会影响匹配行为。
matches()
find()
之间的区别在于,第一个匹配模式与完整的字符串,这就像在模式周围放置锚点
^
$
,而第二个可以在字符串中找到子模式。我不知道它是否是选项卡-当我将输出复制到Notepad++并使用箭头键时,它看起来像空格-不知道选项卡是否转换为空格。无论如何,删除模式中的空间是有效的:)