0

假设我有 IP 10.23.233.34,我想简单地交换233for 234。第一个、第二个和最后一个八位字节是未知的。第三个八位组是233234。我想进行替换,使其与 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

4

4 回答 4

8

这个问题确实不太适合正则表达式解决方案。相反,我会执行以下操作:

$in = "10.23.233.34";
@a = split /\./, $in;
if ($a[2] == '233') {
    $a[2] = '234';
}
print join(".", @a);

上面的代码比您想出的任何正则表达式都更具可读性。此外,下一个必须维护您的代码的人将能够实际阅读它。

于 2012-11-05T19:32:50.223 回答
1

有时正则表达式会使事情变得脆弱和难以理解。尽管如此:

my $ip = '10.23.233.34';
...
for ($ip) {
    s!(?<=\.)233(?=\.\d+$)!234!;
}

详细信息:如果给定一个格式良好的点状四边形,则上面的'233'内容查找必须是第三个八位字节的内容:前面是一个点,后面是一个点,然后是一个或多个数字,然后是字符串结尾。?<=?=防止除 之外的任何东西被'233'捕获,然后'234'被替换。这种方法不能验证 IP 地址的格式是否正确。

于 2012-11-05T19:38:40.990 回答
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
于 2012-11-05T19:38:09.833 回答
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;
于 2012-11-05T19:35:10.447 回答