2012-03-23 69 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 
相关问题