假设我有IP 10.23.233.34
,我想简单地将233
换成234
。第一个,第二个和最后一个八位字节是未知的。第三个八位字节是233
或234
。我想进行替换,使其匹配IP,subs,并保留其他所有内容,同时仍然切换最后一个八位字节。例如:
输入:10.23.233.34
s/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){}233\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){}234\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/
输出:10.23.234.34
答案 0 :(得分:8)
这个问题确实不适合正则表达式解决方案。相反,我会做类似以下的事情:
$in = "10.23.233.34";
@a = split /\./, $in;
if ($a[2] == '233') {
$a[2] = '234';
}
print join(".", @a);
上面的代码比你可能提出的任何正则表达式更具可读性。此外,下一个必须维护代码的人将能够实际阅读它。
答案 1 :(得分:1)
有时正则表达式使事情变得脆弱且难以理解。尽管如此:
my $ip = '10.23.233.34';
...
for ($ip) {
s!(?<=\.)233(?=\.\d+$)!234!;
}
详细信息:如果给定格式良好的点阵四边形,则上面查找必须是第三个八位字节的'233'
:前面有一个点后跟一个点,然后一个或更多数字,然后是字符串结尾。 ?<=
和?=
会阻止捕获'233'
以外的任何内容,然后替换'234'
。这种方法不验证IP地址格式正确。
答案 2 :(得分:0)
$byte = qr/(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])/;
s/($byte)\.($byte)\.(23[34])\.($byte)/join '.', $1, $2, 467-$3, $4/e;
答案 3 :(得分:0)
这是一个选项:
use strict;
use warnings;
my $ip = '10.23.233.34';
$ip =~ s/(\d+)(\.\d+)$/($1 == 233 ? $1+1 : $1) . $2/e;
print $ip;
输出:
10.23.234.34