2011-08-29 85 views
-1

爲什麼這項工作:Perl正則表達式替換?

$my_str=~s/://g; 

但這並不:

$my_str=~s/:://g; 

我有一個字符串,它看起來是這樣的:::this:is:my:string,我需要刪除::,但不觸及:

+2

當你嘗試時會發生什麼? –

+0

你一個接一個地在做什麼? – Arunmu

+3

它適合我。至少它看起來像*「this:is:my:string」的字符串。我不知道它會用一個看起來像「類似」的字符串來做什麼。如果你想真正的答案,顯示真實的代碼。 –

回答

12

正常工作對我來說:

$ echo "::this:is:my:string" | perl -ne "s/:://g; print;" 
this:is:my:string 
4

你確定你沒有在你的代碼拼寫錯誤?而這種替代實際上是問題所在?下面的程序爲我工作:

my $var = '::a:b:c::'; 
print "$var\n"; 
$var =~ s/:://g; 
print "$var\n"; 

輸出:

  1. 打印變量之前,取代後:

    $ perl test.pl 
    ::a:b:c:: 
    a:b:c 
    $ 
    

    編輯,添加一些建議。

  2. 沒有馬上出現問題,但如果您只需要在字符串的開頭刪除::,則可能需要在正則表達式中添加^來指示該問題。
3

有兩件事我能想到的,會導致$my_str =~ s/:://g;失敗:

  1. $my_str不包含你說什麼它包含。
  2. pos($my_str)已設定。

爲了確保$my_str包含你所想象的那樣,你可以使用Data::Dumper,但要確保使用Dumper前做$Data::Dumper::Useqq = 1;

但首先,確保你不會做這樣的事情

if ($my_str =~ /.../g) { 
    ... 
    $my_str =~ s/:://g; 
    ... 
} 

if ($my_str =~ /.../g)是一個常見的錯誤,它可能會導致這個問題。 (我不知道爲什麼,因爲它在概念上甚至沒有意義。)如果是這樣,在if條件中擺脫g