首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行正则表达式替换Perl

执行正则表达式替换Perl
EN

Stack Overflow用户
提问于 2012-11-06 03:25:57
回答 4查看 149关注 0票数 0

假设我有IP 10.23.233.34,我想简单地将233替换为234。第一个、第二个和最后一个二进制八位数未知。第三个二进制八位数是233234。我希望进行替换,使其与IP、subs匹配,并保留其他所有内容,同时仍然切换最后一个八位字节。例如:

输入:10.23.233.34

代码语言:javascript
复制
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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-06 03:32:50

这个问题确实不太适合正则表达式解决方案。取而代之的是,我会这样做:

代码语言:javascript
复制
$in = "10.23.233.34";
@a = split /\./, $in;
if ($a[2] == '233') {
    $a[2] = '234';
}
print join(".", @a);

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

票数 8
EN

Stack Overflow用户

发布于 2012-11-06 03:38:41

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

代码语言:javascript
复制
my $ip = '10.23.233.34';
...
for ($ip) {
    s!(?<=\.)233(?=\.\d+$)!234!;
}

详细信息:如果给定一个格式良好的点分四元组,上面的代码将在必须是第三个八位字节的位置查找'233':前面是一个点,后面是一个点,然后是一个或多个数字,最后是字符串结尾。?<=?=阻止'233'以外的任何东西被捕获,然后'234'被替换。此方法不会验证IP地址的格式是否正确。

票数 1
EN

Stack Overflow用户

发布于 2012-11-06 03:35:10

代码语言:javascript
复制
$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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13238937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档