簡體   English   中英

執行正則表達式替換Perl

[英]Performing a regex substitution Perl

假設我擁有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

這個問題確實不適用於正則表達式解決方案。 相反,我將執行以下操作:

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

上面的代碼比您可能想到的任何正則表達式更具可讀性。 此外,下一個必須維護您的代碼的人將能夠實際閱讀它。

有時,正則表達式使事情變脆並且難以理解。 盡管如此:

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

詳細信息:如果給定格式正確的點分四邊形,則上面的代碼必須在第三個八位字節中查找'233' :前面加一個點,再加一個點,然后是一個或多個數字,然后是字符串末尾。 ?<=?=阻止捕獲'233'以外的任何內容,然后替換'234' 此方法不能驗證IP地址格式正確。

$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;

這是一個選擇:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM