php - How to parse nslookup result by regex
问题描述
I have 2 different nslookup results:
Server: PROXY.LOCAL
Address: 192.168.1.1
Name: google.com
Addresses: 2a02:598:2::1168
77.75.77.168
and
Server: router.local
Address: 192.168.1.1
DNS request timed out.
timeout was 3 seconds.
Name: google.com
Address: 216.58.207.46
My regex code looks like this:
$re = '~(?:Name:\s*\S+\s*)\K(?:\G(?!\A)|^Addresses:|^Address:)\s*\K\S\S\S+~m';
Problem is that when Addresses:
exists it will return only first IP, not second one on new line.
解决方案
您的方法的主要问题是您将匹配“锚定”在(?:Name:\s*\S+\s*)\K
模式上。\K
运算符不会使前面的模式不消耗,并且必须出现该文本才能发生匹配。
您应该确保该模式遵循以下方案:
(?:\G(?!\A)|<START_PATTERN>)<PATTERN_TO_CONSUME_AND_OMIT>\K<PATTERN_TO_EXTRACT>
也就是说,您当前的模式遵循该abc\s+(?:\G(?!\A)|d)\s*\K\S+
方案,它应该是(?:\G(?!\A)|abc\s+d)\s*\K\S+
.
您可以使用修复它
'~(?:\G(?!\A)\R\h+|^Name:\s*\S+\s*Address(?:es)?:)\s*\K\S+~m'
请参阅正则表达式演示。
它匹配
(?:\G(?!\A)\R\h+|^Name:\s*\S+\s*Address(?:es)?:)
- 前一个匹配的结尾 (\G(?!\A)
) + 一个换行符和 1+ 个水平空白字符 (\h+
) 或 (|
) 以下模式的序列:^
- 一行的开始Name:
- 文字子串\s*
- 0+ 个空格\S+
- 1+ 非空白字符\s*
- 0+ 个空格Address
- 文字子串(?:es)?
- 一个可选的非捕获组匹配es
子串 1 或 0 次:
- 一个冒号
\s*
- 0+ 个空格\K
- 匹配重置运算符(丢弃到目前为止匹配的所有文本)\S+
- 1+ 非空白字符。
注意我\h+
在之后添加\G(?!\A)
以确保下一行以 1+ 个水平空格开头,以便在下一行以非空格字符开头时停止匹配。
推荐阅读
- angular - RxJS groupBy 对可观察自定义数组的 ngrx 效果
- caching - DNS 预取和预连接:仅适用于非缓存资源?
- kubernetes - 当 10GB 分配给每个节点的引导磁盘时,Kubernetes 磁盘压力警告
- python - Python - 根据属性对列表中的类对象进行分组
- java - 为什么弹簧安全注销不起作用?
- python - 如何监控 Scrapy 蜘蛛的健康状况
- ios - IOS容器视图在它们之间滑动
- android - Cardview 突然停止显示阴影
- java - 如何在 Swing 中制作适当的表格,并使用适当的布局将所有元素放在各自的位置?
- python - 如何修复这个链表算法