gpt4 book ai didi

java - 使用 Java8 捕获 traceroute 中的组的正则表达式

转载 作者:搜寻专家 更新时间:2023-10-31 20:17:20 27 4
gpt4 key购买 nike

我正在尝试使用 Regex 在 Java8 中解析 traceroute 结果。

我正在使用以下正则表达式来识别组。

^(\\d*).*[AS(\\d*)]?\\s+([\\w+\\.]+)\\s+\\(([\\d+\\.]+)\\)[\\s+(\\d+\\.\\d+)\\s+ms]+

我需要解析的一些示例行是:

1  10.33.128.1 (10.33.128.1)  4.452 ms  3.459 ms  3.474 ms  
6 * [AS3356] 4.68.72.218 (4.68.72.218) 12.432 ms 11.819 ms
* 4.68.72.218 (4.68.72.218) 12.432 ms 11.819 ms
61.182.180.62 (61.182.180.62) 175.300 ms 203.001 ms

我想提取跳数(如果可用)、ASN(如果可用)、主机名、IP 和时间

但使用上面的正则表达式,它匹配字符串 1、2 和 4,这是我想要的,但只给我跃点、主机和 ASN。

我的代码是这样的:

Pattern hop_pattern = Pattern.compile(
"^(\\d*).*[AS(\\d*)]?\\s+([\\w+\\.]+)\\s+\\(([\\d+\\.]+)\\)[\\s+(\\d+\\.\\d+)\\s+ms]+")
Matcher m = hop_pattern.matcher(target);

while(m.find()) {
System.out.println("count: " + m.groupCount());
for(int i = 1; i < m.groupCount() + 1; i++) {
System.out.println(i + "->" + m.group(i));
}
}

我需要解析的一些示例行是:

1 10.33.128.1 (10.33.128.1) 4.452 ms 3.459 ms 3.474 ms
6 * [AS3356] 4.68.72.218 (4.68.72.218) 12.432 ms 11.819 ms
* 4.68.72.218 (4.68.72.218) 12.432 ms 11.819 ms
61.182.180.62 (61.182.180.62) 175.300 ms 203.001 ms

我想提取跳数(如果可用)、ASN(如果可用)、主机名、IP 和时间

但使用上面的正则表达式,它匹配字符串 1、2 和 4,这是我想要的,但只给我跃点、主机和 ASN。

我的代码是这样的:

    Pattern hop_pattern = Pattern.compile(
"^(\\d*).*[AS(\\d*)]?\\s+([\\w+\\.]+)\\s+\\(([\\d+\\.]+)\\)[\\s+(\\d+\\.\\d+)\\s+ms]+")
Matcher m = hop_pattern.matcher(target);

while(m.find()) {
System.out.println("count: " + m.groupCount());
for(int i = 1; i < m.groupCount() + 1; i++) {
System.out.println(i + "->" + m.group(i));
}
}

我不确定代码或正则表达式本身是否有问题。感谢您的帮助!

更新:一些示例和样本输出

1 [AS0] 10.200.200.200 (10.200.200.200) 37.526 ms 35.793 ms 37.728 ms
Expected Output: hop: 1 asn: 0 hostname: 10.200.200.200 ip: 10.200.200.200 time: [37.526, 35.793, 37.728]

2 [AS0] scsc-usr-13500-02-eth1-07.xyz.com (10.96.15.3) 37.927 ms 36.122 ms *
Expected Output: hop: 2 asn: 0 hostname: scsc-usr-13500-02-eth1-07.xyz.com ip: 10.96.15.3 time: [37.927, 36.122]

我不确定代码或正则表达式本身是否有问题。感谢您的帮助!

最佳答案

回答

第 1 部分

为了捕获您要查找的所有内容,您需要使用两个单独的正则表达式。这样做的原因是正则表达式只会捕获它找到的与条件匹配的 last 组,并且您的跟踪路由结果中有多个时间(例如 4.452 ms3.459 ms , 和 3.474 ms 在你的第一行)。

为了了解捕获了哪些组,您可以使用以下正则表达式(它是 PCRE,在 Java 中不起作用,但它可以清楚地指示捕获了哪个组)。

This code can be seen in use here

^(?P<hop>\d+)?[\h*]*(?:\[AS(?<ASN>\d*)\])?\h+(?<hostname>[\w\.]+)\h+\((?<ip>[\d+\.]+)\)\h+(?<times>.*?)\h*$

稍微修改一下,上面的正则表达式就可以在 Java 中使用(据我所知,Java 正则表达式不支持水平空格 \h 和命名捕获组 (?<name>...))。

This code can be seen in use here

^(\d+)?[\ \t*]*(?:\[AS(\d*)\])?[\ \t]+([\w\.]+)[\ \t]+\(([\d+\.]+)\)[\ \t]+(.*?)[\ \t]*$

注意:都是全局的g和多行 m使用修饰符。


第 2 部分

对您在第 1 部分 中捕获的时间 运行第二个正则表达式以收集所有时间的列表。

This code can be seen in user here

([\d.]+)





结果

第 1 部分

输入

1  10.33.128.1 (10.33.128.1)  4.452 ms  3.459 ms  3.474 ms  
6 * [AS3356] 4.68.72.218 (4.68.72.218) 12.432 ms 11.819 ms
* 4.68.72.218 (4.68.72.218) 12.432 ms 11.819 ms
61.182.180.62 (61.182.180.62) 175.300 ms 203.001 ms

输出

匹配 1

  • 完整比赛 0-60 1 10.33.128.1 (10.33.128.1) 4.452 ms 3.459 ms 3.474 ms
  • 第 1 组。1
  • 第 3 组。10.33.128.1
  • 第 4 组。10.33.128.1
  • 第 5 组。4.452 ms 3.459 ms 3.474 ms

匹配 2

  • 完整比赛 61-124 6 * [AS3356] 4.68.72.218 (4.68.72.218) 12.432 ms 11.819 ms
  • 第 1 组。6
  • 第 2 组。3356
  • 第 3 组。4.68.72.218
  • 第 4 组。4.68.72.218
  • 第 5 组。12.432 ms 11.819 ms

匹配 3

  • 完整匹配 125-177 * 4.68.72.218 (4.68.72.218) 12.432 ms 11.819 ms
  • 第 3 组。4.68.72.218
  • 第 4 组。4.68.72.218
  • 第 5 组。12.432 ms 11.819 ms

第 4 场比赛

  • 完整匹配 178-232 61.182.180.62 (61.182.180.62) 175.300 ms 203.001 ms
  • 第 3 组。61.182.180.62
  • 第 4 组。61.182.180.62
  • 第 5 组。175.300 ms 203.001 ms

第 2 部分

输入

4.452 ms  3.459 ms  3.474 ms 

输出

匹配 1

  • 完整比赛 0-5 4.452
  • 第 1 组。4.452

匹配 2

  • 完整比赛 10-15 3.459
  • 第 1 组。3.459

匹配 3

  • 整场比赛 20-25 3.474
  • 第 1 组。3.474





编辑

感谢Casimir et Hippolyte指出 Java 确实像其他正则表达式风格一样允许命名捕获组。

这是一个更新的正则表达式,因为 Java 确实支持命名的捕获组 (?<name>...)

This regex can be seen in use here

^(?P<hop>\d+)?[\t *]*(?:\[AS(?<ASN>\d*)\])?[\t ]+(?<hostname>[\w\.]+)[\t ]+\((?<ip>[\d+\.]+)\)[\t ]+(?<times>.*?)[\t ]*$

关于java - 使用 Java8 捕获 traceroute 中的组的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46224504/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com