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