2012-03-23 62 views
17

我有動態生成的字符串,如@#@[email protected]!#!,我想使用Perl從字符串中刪除特定字符。從Perl字符串中刪除特定字符的更好方法

目前我做這個東西(什麼也沒有替換字符):

$varTemp =~ s/['\$','\#','\@','\~','\!','\&','\*','\(','\)','\[','\]','\;','\.','\,','\:','\?','\^',' ', '\`','\\','\/']//g; 

是否有這樣做的更好的辦法?我正在尋找一些乾淨的東西。

回答

23

你誤解了如何character classes使用:

$varTemp =~ s/[\$#@~!&*()\[\];.,:?^ `\\\/]+//g; 

不一樣的您正則表達式(假設你並不想從你的字符串中刪除'字符)。

編輯:+允許幾個「特殊字符」一次匹配,所以它也應該更快。

13

您可以使用TR來代替:

 $p =~ tr/fo//d; 

將刪除所有的f和從$p每人都。你的情況應該是:

 $p =~ tr/\$#@~!&*()[];.,:?^ `\\\///d 
0

那麼,如果您使用的是隨機生成的字符串,使其具有的一些有意的字符串,你通常可能在數據被找到匹配的概率很低,那麼你可能需要每個文件一個字符串。

你拿那個字符串,叫它$place_older說。然後,當你想消除的文字,你叫quotemeta,並使用該值來代替:

my $subs = quotemeta $place_holder; 
s/$subs//g; 
+0

這將反斜線所有非單詞字符。當我只想刪除一組特定的字符時,這不會起作用。 – Ron 2012-03-23 23:27:51

6

一個字符類這個大很容易說你要保留的。在字符類的第一個位置A插入符號反轉的感覺,所以你可以寫

$varTemp =~ s/[^"%'+\-0-9<=>a-z_{|}]+//gi 

,或者使用更高效的tr

$varTemp =~ tr/"%'+\-0-9<=>A-Z_a-z{|}//cd 
相關問題