📜  珀尔 |使用正则表达式从字符串中提取 IP 地址

📅  最后修改于: 2022-05-13 01:54:26.934000             🧑  作者: Mango

珀尔 |使用正则表达式从字符串中提取 IP 地址

Perl 代表实用提取和报告语言,这是未经授权的首字母缩略词。 Perl 编程语言最强大的功能之一是正则表达式,在本文中,您将学习如何从字符串中提取 IP 地址。正则表达式可以是简单的也可以是复杂的,这取决于您想要匹配的模式,例如我们的标题——使用正则表达式从字符串中提取 IP 地址。从字符串中提取 IP 地址可能是一项简单或具有挑战性的任务。因此,人们喜欢和讨厌正则表达式。它们是表达简单模式的好方法,也是表达复杂模式的可怕方法。下面给出了量词和字符的一些示例及其含义:

QuantifierMeaning
a*zero or more a’s
a+one or more a’s
a?zero or one a’s
a{m}exactly m a’s
a{m,}at least m a’s
a{m,n}at least m but at most n a’s
CharacterMeaning
^beginning of string
$end of string
.any character except newline
*match 0 or more times
+match 1 or more times
?match 0 or 1 times
|alternative
( )grouping
[ ]set of characters
{ }repetition modifier
\quote or special

从字符串中提取 IP 地址

最简单的方法就是取任何由句点分隔的四个十进制数字的字符串是

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/ OR /^\d+\.\d+\.\d+\.\d+$/

在以下示例中,我们只是从给定字符串中提取 IP 地址。

#!/usr/bin/perl
  
my $ip = "MY IP ADDRESS IS172.26.39.41THIS IS A VALID IP ADDRESS";
  
if($ip =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/)
{
    $ip = $1;
    print "$ip\n";
}

输出:

但是,上面的示例也接受了错误的 IP 地址,例如 596.368.258.269。我们知道,正确的十进制点分 IP 地址没有大于 255 的值,并且编写一个匹配整数 0 到 255 的正则表达式是一项艰巨的工作,因为正则表达式不理解算术;它们纯文本操作。因此,您必须以纯文本方式描述整数 0 到 255。

现在,我们将看到一个提取 IP 地址的实现,它还将检查八位字节范围。

#!/usr/bin/perl
  
my $ip = "MY IP ADDRESS IS 36.59.63 THIS IS A VALID IP ADDRESS";
  
if($ip =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/)
{
    if($1 <= 255 && $2 <= 255 && $3 <= 255 && $4 <= 255)
    {
        print("Each octet of an IP address ",
              "is within the range - $1\n");
        print("\nIP address accepted!\n");
    }
    else
    {
        print("Octet not in range - $1\n",
              "IP address not accepted\n");
    }
}
else
{
    print("Valid IP address not found in a given string\n");
}

输出:

如果将字符串更改为

[my $ip = "MY IP ADDRESS IS 127.36.59.63 THIS IS A VALID IP ADDRESS";] 

那么输出是

在下面的示例中,我们从用户那里接受一个包含 IP 地址的字符串,然后从中提取 IP 地址。我们使用chomp()函数从字符串末尾删除任何字符。

#!/usr/bin/perl
  
print("Enter the IP Address you would like to validate - ");
my $ip = ;
  
if($ip =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/)
{
    $ip = $1;
}
  
chomp($ip);
  
if($ip =~ m/^(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)$/)
{
    print("\nIP address found - $ip\n");
    if($1 <= 255 && $2 <= 255 && $3 <= 255 && $4 <= 255)
    {
        print("Each octet of an IP address is ",
              "within the range - $1.$2.$3.$4\n");
        print("\n-> $ip IP address accepted!\n");
    }
    else
    {
        print("Octet(s) out of range. ",
              "Valid number range between 0-255\n");
    }
}
else
{
    print("IP Address $ip is not in a valid format\n");
}

输出: