我有2个不同的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,而不返回新行中的第二个IP。
答案 0 :(得分: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'
请参见regex demo。
它匹配
(?:\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+个水平空格开头,以便在下一行以非空白字符开头时停止匹配。