2012-11-05 103 views
0

假設我有IP 10.23.233.34,我想簡單地將233換成234。第一個,第二個和最後一個八位字節是未知的。第三個八位組是233234。我想進行替換,使其匹配IP,subs,並在仍然切換最後一個字節的同時保留其他所有內容。例如:執行正則表達式替換Perl

輸入: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

+0

OP的完整問題的重複,或者更確切地說是子集:http://stackoverflow.com/questions/13239270 – pilcrow

+1

你不是在切換第三個八位字節嗎?最後一個是'34',並保留'34'。 – simbabque

回答

8

這個問題真的不適合用於好一個正則表達式的解決方案。相反,我會做類似以下的事情:

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

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

+0

這很好,假設您在修改之前不必驗證該字符串實際上是否包含IP地址。此外,你有一個錯字 - 條件如果應該有一個'==',而不是'='。 –

+1

這個問題陳述「假設我有知識產權...」,所以我採用了這個假設。如果需要,驗證輸入格式是另外一行。 (謝謝,固定'=='。) –

+0

我必須驗證它是一個IP。假設我有一條「喜歡我的IP是10.23.233.34,我住的地方離紐約市0.233英里的地方是10.233.233.34」哦,我的朋友IP是10.33.233.55「我的兩個實例10.23.233.34都應該改成10.23.234.34和10.33.233.55應改爲10.33.234.55。其他一切都應該留下。哦,格雷格發佈關於upvotes的錯誤是什麼?它鼓勵回答。 – user974896

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

有時正則表達式使事情變得脆弱和難於理解。儘管如此:

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

詳情:如果給一個結構良好的點分四組,上述驗看'233'在什麼必須是第三個八位字節:由點之前和之後一個點,那麼一個或多個數字,然後結束字符串。 ?<=?=防止捕獲除'233'以外的任何內容,然後'234'被替換。這種方法確實而不是驗證IP地址是格式良好的。