2011-06-30 110 views
6

我有我認爲將是一個簡單的問題來解決,但我無法找到答案。Perl搜索並替換最後一個字符出現

如何找到並替換字符串中最後一次出現的字符?我有一個字符串:GE1/0/1,我希望它是:GE1/0:1 < - 這可以是可變長度,所以沒有子字符串請。

澄清: 我正在尋找替換最後/與:無論是之前或之後。

回答

11
use strict; 
use warnings; 
my $a = 'GE1/0/1'; 
(my $b = $a) =~ s{(.*)/}{$1:}xms; 
print "$b\n"; 

我用的.*

+0

謝謝你,這完美地工作。 – shaneburgess

2

貪婪的行爲,這一發現一個斜槓和展望,以確保沒有更多的斜槓過去吧:

原正則表達式:

/(?=[^/]*$) 

我認爲代碼看起來像這樣,但perl不是我的語言:

$string =~ s!/(?=[^/]*$)!\:!g; 
4

也許我有不明白的具有可變長度的問題,但我會做到以下幾點:

可以匹配你想用正則表達式是什麼:

(.+)/ 

所以,這個Perl腳本

my $text = 'GE1/0/1'; 
$text =~ s|(.+)/|$1:|; 
print 'Result : '.$text; 

將輸出:

Result : GE1/0:1 

「+」量詞默認爲「貪婪」,它只會匹配最後一個斜槓字符。

希望這是你問的。

1

「字符串中的最後一次出現」稍微不明確。我看到它的方式,您可能意味:

"Foo: 123, yada: GE1/0/1, Bar: null" 

意義的 「單詞」 GE1/0/1的最後出現,或者:

"GE1/0/1" 

作爲一個完整的字符串。

在後一種情況下,這是一個相當簡單的問題,你只需要決定你在正則表達式中的具體含義。

$str =~ s{/(\d+)$}{:$1}; 

完全正常,假設最後一個字符只能是數字。

在前一種情況下,我不認爲你是指,但無論如何,我會包括你需要更加具體:

$str =~ s{(\byada:\s+\w+/\w+)/(\w+\b)}{$1:$2};