繁体   English   中英

如何使用 Perl 正则表达式提取多行代码?

[英]How do I extract multiple lines of code using Perl regex?

我正在尝试从本网站提取所有 IP 地址: http://www.game-monitor.com/

我想对该页面上的 IP 进行正则表达式,提取所有 IP 并将它们显示在屏幕上。

这是我到目前为止所拥有的,你能告诉我有什么问题并帮助我吗?

#!/usr/bin/perl

use HTTP::Request;
use LWP::UserAgent;

print 'Press [1] To Begin: ';
chomp ($begin = <STDIN>);

my $url = 'http://www.game-monitor.com/';
my @ips = ('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}','\d{1,3}\.\d{1,2}\.\d{1,3}\.\d{1,2}','\d{1,2}   \.\d{1,3}\.\d{1,2}\.\d{1,3}','\d{1,2}\.\d{1,2}\.\d{1,2}\.\d{1,3}','\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,2}','\d{1,3}\.\d{1,3}\.\d{1,2}\.\d{1,2}','\d{1,2}\.\d{1,2}\.\d{1,3}\.\d{1,3}','\d{1,2}\.\d{1,2}\.\d{1,2}\.\d{1,2}','\d{1,2}\.\d{1,3}\.\d{1,3}\.\d{1,2}','\d{1,3}\.\d{1,2}\.\d{1,2}\.\d{1,3}');

if ($begin eq 1)
{
my $request = HTTP::Request->new(GET => $url);
my $useragent = LWP::UserAgent->new();
my $response = $useragent->request($request);
my $result = $response->content;

foreach $ip (@ips)
{
if ($result =~ /($ips[0])/ ||
$result =~ /($ips[1])/ ||
$result =~ /($ips[2])/ ||
$result =~ /($ips[3])/ ||
$result =~ /($ips[4])/ ||
$result =~ /($ips[5])/ ||
$result =~ /($ips[6])/ ||
$result =~ /($ips[7])/ ||
$result =~ /($ips[8])/ ||
$result =~ /($ips[9])/
)
{
    print "IP: $1 \n";
    print "IP: $2 \n";
    print "IP: $3 \n";
    print "IP: $4 \n";
    print "IP: $5 \n";
    print "IP: $6 \n";
    print "IP: $7 \n";
    print "IP: $8 \n";
    print "IP: $9 \n";
    print "IP: $10 \n";
}
}
}

为了简化多行替换,使用/s modifier ,它实际上告诉 Perl 假装字符串是单行——即使它不是。

有关更多详细信息,请参见perlre

如果您使用像Regexp::Common::net这样的模块会很好——为 IPv4 地址提供正则表达式,而不是编写自己的正则表达式来匹配 ip 地址。

例如尝试类似的东西,

use Regexp::Common qw/net/;
while (<>) {
  print $1, "\n" if /($RE{net}{ipv4})/;
}

使用/g修饰符匹配所有 IP。 提示:使用-w参数和strict的 package 以避免“糟糕的编码风格”。

#!/usr/bin/perl -w

use strict;
use HTTP::Request;
use LWP::UserAgent;

print 'Press [1] To Begin: ';
chomp (my $begin = <STDIN>);

my $url = 'http://www.game-monitor.com/';
my $ip_regex = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if ($begin eq 1)
{
    my $request = HTTP::Request->new(GET => $url);
    my $useragent = LWP::UserAgent->new();
    my $response = $useragent->request($request);
    my $result = $response->content;

    while ($result =~ /($ip_regex)/g)
    {
        print "IP: $1 \n";
    }

}
#!/usr/bin/perl

use HTTP::Request;
use LWP::UserAgent;


my $url = 'http://www.game-monitor.com/';
my $request = HTTP::Request->new(GET => $url);
my $useragent = LWP::UserAgent->new();
my $response = $useragent->request($request);
my $result = $response->content;

@m = ($result =~ /\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/sg);
foreach (@m) {
        print "IP: $_\n";
}

我真的不明白你想用你的大数组@ips做什么。 第一个正则表达式已经匹配所有 IP 地址(因为\d{1,3}表示“一到三位数”,它已经包含具有两位数的 IP 地址),所以你不需要所有这些排列与\d{1,2} .

您可以做的一件事是用\b单词边界锚围绕您的正则表达式,以确保您不匹配99123.123.123.12399或类似内容中的123.123.123.123 此外,您可能知道您的正则表达式也会匹配999.999.999.999类的内容。 如果这不是问题,因为您的输入不会包含无效的 IP 地址,那当然没问题。

最后,您需要/g全局修饰符,以便您的正则表达式不仅找到字符串中的第一个,而且找到所有出现的位置。

本质上,如何这样做:

while ($result =~ m/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g) {
    print "IP: $&\n";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM