如何使用正则表达式解析nslookup结果

3

我有两个不同的nslookup结果:

Server:  PROXY.LOCAL
Address:  192.168.1.1

Name:    google.com
Addresses:  2a02:598:2::1168
     77.75.77.168

并且

Server:  router.local
Address:  192.168.1.1

DNS request timed out.
    timeout was 3 seconds.
Name:    google.com
Address:  216.58.207.46

我的正则表达式代码长这样:

$re = '~(?:Name:\s*\S+\s*)\K(?:\G(?!\A)|^Addresses:|^Address:)\s*\K\S\S\S+~m';

问题在于当存在Addresses:时,它只会返回第一个IP地址,而不是在新行上的第二个。

1个回答

2
你的方法存在一个主要问题,就是你在模式中“锚定”了匹配项:(?: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 - : - 冒号 - \s* - 0个或多个空白字符 - \K - 匹配重置操作符(到目前为止匹配的所有文本都被丢弃) - \S+ - 匹配1个或多个非空白字符
请注意,我在\G(?!\A)后添加了\h+,以确保下一行以1个或多个水平空格字符开头,以便停止匹配,如果下一行以非空白字符开头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接