从Perl字符串中删除特定字符的更好方法

时间:2012-03-23 23:02:31

标签: regex string perl character

我有动态生成的字符串,如@#@!efq@!#!,我想使用Perl从字符串中删除特定字符。

目前我正在做一些事情(用什么都不替换字符):

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

有更好的方法吗?我正在寻找干净的东西。

4 个答案:

答案 0 :(得分:24)

您误解了character classes的使用方式:

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

与正则表达式相同(假设您不是要从字符串中删除'个字符)。

编辑:+允许一些“特殊字符”同时匹配,因此它也应该更快。

答案 1 :(得分:17)

您可以改用tr:

       $p =~ tr/fo//d;

将从$p中删除每个f和每个o。在你的情况下应该是:

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

答案 2 :(得分:7)

对于这么大的角色类,更容易说出你想要保留的内容。字符类第一个位置的插入符反转其意义,因此您可以编写

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

或使用效率更高的tr

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

答案 3 :(得分:0)

如果您正在使用随机生成的字符串,以便它很可能与您通常在数据中找到的某些有意字符串匹配,那么您可能希望每个文件有一个字符串。

你接受那个字符串,称之为$place_older。然后,当您想要删除文本时,请调用quotemeta,然后使用该值替换:

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