假设我有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
发布于 2012-11-06 03:32:50
这个问题确实不太适合正则表达式解决方案。取而代之的是,我会这样做:
$in = "10.23.233.34";
@a = split /\./, $in;
if ($a[2] == '233') {
$a[2] = '234';
}
print join(".", @a);上面的代码比您想出的任何正则表达式都更具可读性。此外,下一个必须维护您的代码的人将能够实际阅读它。
发布于 2012-11-06 03:38:41
有时正则表达式会使事情变得脆弱,更难理解。尽管如此:
my $ip = '10.23.233.34';
...
for ($ip) {
s!(?<=\.)233(?=\.\d+$)!234!;
}详细信息:如果给定一个格式良好的点分四元组,上面的代码将在必须是第三个八位字节的位置查找'233':前面是一个点,后面是一个点,然后是一个或多个数字,最后是字符串结尾。?<=和?=阻止'233'以外的任何东西被捕获,然后'234'被替换。此方法不会验证IP地址的格式是否正确。
发布于 2012-11-06 03:35:10
$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;https://stackoverflow.com/questions/13238937
复制相似问题