执行正则表达式替换Perl

时间:2012-11-05 19:25:57

标签: regex perl substring pcre

假设我有IP 10.23.233.34,我想简单地将233换成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 个答案:

答案 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