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

Ron*_*Ron 19 regex string perl character

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

目前我正在做这件事(用什么都替换字符):

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

有没有更好的方法呢?我正在寻找干净的东西.

Tim*_*ker 24

您误解了字符类的使用方式:

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

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

编辑:+允许一些"特殊字符"一次匹配,所以它也应该更快.


Shi*_*zou 18

您可以使用tr代替:

       $p =~ tr/fo//d;
Run Code Online (Sandbox Code Playgroud)

将删除每个f和每个o $p.在你的情况下,它应该是:

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


Bor*_*din 7

对于这个大字符类,更容易说出你想要保留的内容.角色类的第一个位置的插入符反转了它的意义,所以你可以写

$varTemp =~ s/[^"%'+\-0-9<=>a-z_{|}]+//gi
Run Code Online (Sandbox Code Playgroud)

或者,使用效率更高 tr

$varTemp =~ tr/"%'+\-0-9<=>A-Z_a-z{|}//cd
Run Code Online (Sandbox Code Playgroud)