1

Stack Overflow RegEx Wizards,我搜索了谷歌并没有找到一个好的解决方案。我需要从 IPCONFIG 结果中提取 1:N DNS 服务器。在下面的示例中,我需要前三个。但是,可能会有更多或更少的情况。

更新:最理想的情况是,我们希望将光标放在 DNS 字符串中的第一个冒号 (:) 处,然后捕获 IP,直到我们遇到一个字母字符。因此,如果我们可以从该冒号抓取一个字符串到该字母字符,我们可以运行另一个 RegEx 来匹配 IP。

DNS.*:让我们到达第一个冒号 (:)

需要预读直到字母字符。

重要提示:由于我们使用的是第三方工具,我们只能使用 RegEx :)

这是我一直用于 IP 的 RegEx 值。这将捕获所有 IP 而不仅仅是 DNS ......

(([0-9]){1,3}.){1,3}[0-9]{1,3}

IPCONFIG 示例

    Subnet Mask . . . . . . . . . . . : 255.255.255.0
    Default Gateway . . . . . . . . . : 152.225.244.1
    DHCP Server . . . . . . . . . . . : 10.204.40.57
    DNS Servers . . . . . . . . . . . : 10.204.127.11
                                        10.207.2.50
                                        10.200.10.6
    Primary WINS Server . . . . . . . : 10.207.40.145
    Secondary WINS Server . . . . . . : 10.232.40.38
    Lease Obtained. . . . . . . . . . : Tuesday, August 28, 2012 6:45:12 AM
    Lease Expires . . . . . . . . . . : Sunday, September 02, 2012 6:45:12 A
4

5 回答 5

1
#!/usr/bin/env perl

use strict;
use warnings;

my $data = <<END;
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 152.225.244.1
DHCP Server . . . . . . . . . . . : 10.204.40.57
DNS Servers . . . . . . . . . . . : 10.204.127.11
                                    10.207.2.50
                                    10.200.10.6
Primary WINS Server . . . . . . . : 10.207.40.145
Secondary WINS Server . . . . . . : 10.232.40.38
Lease Obtained. . . . . . . . . . : Tuesday, August 28, 2012 6:45:12 AM
Lease Expires . . . . . . . . . . : Sunday, September 02, 2012 6:45:12 A
END

my @ips = ();

if ($data =~ /^DNS Servers[\s\.:]+((\d{2}\.\d{3}\.\d{1,3}\.\d{1,3}\s*)+)/m) {
    @ips = split(/\s+/, $1);
    print "$_\n" foreach(@ips);
}
于 2012-08-30T17:33:30.927 回答
0

我会使用unpack而不是正则表达式来解析基于列的数据:

#!/usr/bin/env perl

use strict;
use warnings;

while (<DATA>) {
    my ($ip) = unpack 'x36 A*';
    print "$ip\n";
}

__DATA__
DNS Servers . . . . . . . . . . . : 10.204.127.11
                                    10.207.2.50
                                    10.200.10.6
Primary WINS Server . . . . . . . : 10.207.40.145
Secondary WINS Server . . . . . . : 10.232.40.38

您可能必须将数字调整为36应跳过的实际字符数。

于 2012-08-30T16:47:38.590 回答
0

匹配

DNS.+?:(\s*([\d.]+).)+

并拉出组。这假设您将整个多行字符串放在一个 blob 中,并且提取的文本可能包含换行符和其他空格。最后一个点是匹配换行符,需要使用/moption

于 2012-08-30T16:56:36.083 回答
0

就个人而言,我会朝着不同的方向前进。我不会手动解析 ipconfig 的输出,而是使用 Win32::IPConfig 模块。 Win32::IPConfig - Windows NT/2000/XP/2003 的 IP 配置设置

use Win32::IPConfig;
use Data::Dumper;

my $host = shift || "127.0.0.1";
my $ipconfig = Win32::IPConfig->new($host);

my @searchlist = $ipconfig->get_searchlist;
print Dumper \@searchlist;
于 2012-08-30T17:07:15.840 回答
0

匹配这个正则表达式(参见实际操作):

DNS Servers.*:\s*(.*(?:[\n\r]+\s+.*(?:[\n\r]+\s+.*)?)?)

第一个捕获组将是您请求的三个 IP(最多三个)。您肯定需要修剪空格。

编辑:正则表达式固定为最多匹配三个 IP。如果 IP 较少,则仅匹配它们。

于 2012-08-30T17:24:36.540 回答