首页 > 解决方案 > 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.

标签: phpregex

解决方案


您的方法的主要问题是您将匹配“锚定”在(?: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+ 个水平空格开头,以便在下一行以非空格字符开头时停止匹配。


推荐阅读