perl正则表达式匹配所有IPv4地址

时间:2016-05-05 10:35:48

标签: regex perl

我正在尝试废弃列出的IP地址的apache状态页面,例如apache status page

<tr><td><b>0-35</b></td><td>1791</td><td>1/1079/387615</td><td>G
</td><td>5541.08</td><td>379</td><td>557</td><td>135.0</td><td>33.04</td><td>20992.04
</td><td>83.60.245.1</td><td nowrap></td><td nowrap></td></tr>

我已下载页面

 #!/usr/bin/perl
    use strict;
    use warnings;
    use LWP::Simple;
    use feature 'say';
    use File::Slurp;
    my $content = get('http://www.apache.org/server-status') or die 'Unable to get page';

    write_file('filename',$content);

如何创建找到的IP地址数组?

谢谢

3 个答案:

答案 0 :(得分:4)

我使用CPAN上提供的use Regexp::Common qw /net/; while ($content =~ m!<td>($RE{net}{IPv4})</td>!g) { print "IP: $1\n"; } Documentation)模块,如下所示:

onPrepare

答案 1 :(得分:3)

只需找到以点分隔的1-3位数组的所有条目,然后验证每个条目在0-255范围内。

while ($content =~ /(?<!\d)(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})(?!\d)/g) {
    if (
        $1 >= 0 && $1 <= 255 &&
        $2 >= 0 && $2 <= 255 &&
        $3 >= 0 && $3 <= 255 &&
        $4 >= 0 && $4 <= 255
    ) {
        print "$1.$2.$3.$4\n";
    }
}

答案 2 :(得分:1)

\d{1,3}(\.\d{1,3}){3}

这不足以专门匹配所有ipv4地址,但应该足够您的页面。

例如,它也会匹配522.53.0.0

演示:http://regexr.com/3dc1q