Java 为什么在我的正则表达式中从错误的区域捕获组?(爪哇7)
正在从错误的区域捕获数据。它从eth1而不是eth0捕获ip地址字段和子网。我不明白为什么会这样。我还尝试了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
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++并使用箭头键时,它看起来像空格-不知道选项卡是否转换为空格。无论如何,删除模式中的空间是有效的:)