2013-11-22 213 views
0

我想在找到字符串匹配之前替換空格/製表符/或任何字符。在Perl中的字符串匹配之前替換字符

鑑於這種輸入:

「1)蘋果2)藍色筆3)黑色襯衫4)紅色帽子」。

我想這樣的輸出:

1)apple._2)藍色pen._3)黑色shirt._4)紅色帽子。

有一個固定的模式,如一個數字後跟),並在此之前,我想要一個替換。

代碼:

$str = "1)apple. 2)blue pen. 3)black shirt. 4)red hat."; 
print "before ==> $str \n"; 
$str =~ s/.(\d+)/_/g; 
print "after ==> $str \n"; # o/p: 1)apple._)blue pen._)black shirt._)red hat. 

感謝

+1

是否要替換數字前面的任何字符或任何固定模式,或者如果它是空格,您是否只想替換它?例如,應該將'1)apple2)藍色筆變成'1)appl_2)藍色筆或'1)apple_2)藍色筆。「,還是完全不符合該模式(無變化)? –

回答

1

改變你的模式s/.(\d+)/_/gs/.(\d+\))/_\1/g。在模式中\1意味着你捕捉值

更新:

開啓警告後,它表明這是更好的書面\1$1

+2

在替換字符串中,您應該使用'$ 1',而不是'\ 1'。後者是用於模式定義的後向引用。如果您啓用警告,您應該會看到這一點。 – FMc

+0

太好了。感謝您的快速回復:) – Ganesh

+0

感謝您指出並且我看到了警告。 @FMc – akawhy

2

您需要捕獲的比賽$1添加到更換側你的替代操作符。

$str =~ s/.(\d+\))/_$1/g; 

你也可以在這裏使用一個lookahead斷言。

$str =~ s/.(?=\d+\))/_/g; 

如果你有多個數字的模式,例如9)orange. 10)black shirt.上面會失敗。相反,你可以使用否定匹配,這將做到這一點。

$str =~ s/[^\d](?=\d+\))/_/g;