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

问题描述 投票:21回答:4

我已经动态生成了类似@#@!efq@!#!的字符串,并且我想使用Perl从字符串中删除特定的字符。

当前我正在执行此操作(将字符替换为空):

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

是否有更好的方法?我在骗些干净的东西。

regex string perl character
4个回答
25
投票

您误解了character classes的用法:

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

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

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


20
投票

您可以改用tr

       $p =~ tr/fo//d;

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

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

请参见Perl's tr documentation

tr/SEARCHLIST/REPLACEMENTLIST/cdsr

将在搜索列表中找到的所有出现的字符音译(或在没有指定/c修饰符的情况下找不到,在替换列表中具有位置对应的字符,可能会删除,取决于指定的修饰符。

[…]

如果指定了/d修饰符,则将删除在REPLACEMENTLIST中找不到的由SEARCHLIST指定的任何字符。


8
投票

使用这么大的角色类,您更容易说出您想要保留的内容。字符类的第一个位置中的插入符号会反转其含义,因此您可以编写

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

或者,使用更有效的tr

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

tr docs


0
投票

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

您采用该字符串,称其为$place_older。然后,当您要消除文本时,请调用quotemeta,并使用该值替换:

quotemeta
© www.soinside.com 2019 - 2024. All rights reserved.