Perl 使用Regex从一个字符串中提取IP地址
Perl是实用提取和报告语言的缩写,这不是授权的缩写。Perl编程语言最强大的功能之一就是正则表达式,在这篇文章中,你将学习如何从一个字符串中提取IP地址。正则表达式可以是简单的,也可以是复杂的,这取决于你想要匹配的模式,就像我们的标题–使用Regex从字符串中提取IP地址。从一个字符串中提取IP地址可以是一个简单的任务,也可以是一个具有挑战性的任务。因此,人们对正则表达式又爱又恨。它们是表达简单模式的好方法,也是表达复杂模式的可怕方法。下面给出了一些量词和字符的例子以及它们的含义。
量词 | 意义 |
---|---|
a* |
零个或多个a |
a+ |
一个或多个a |
a? |
零个或一个a’s |
a{m} |
正是m个a的 |
a{m,} |
至少有m个a |
a{m,n} |
至少有m个但最多有n个a’s |
角色 | 意义 |
---|---|
^ |
字符串的开头 |
$ |
字符串的结尾 |
. |
除换行外的任何字符 |
* |
匹配0次或更多次 |
\+ |
匹配1次或更多次 |
? |
匹配0或1次 |
| |
替代 |
( ) |
分组 |
[ ] |
一组字符 |
{ } |
反复修饰语 |
\ |
引用或特殊 |
从一个字符串中提取一个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 = <STDIN>;
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 Addressip is not in a valid format\n");
}
输出: