【问题标题】:Better way to remove specific characters from a Perl string从 Perl 字符串中删除特定字符的更好方法
【发布时间】:2012-04-08 12:08:53
【问题描述】:

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

目前我正在做这样的事情(将字符替换为空):

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

有没有更好的方法来做到这一点?我正在寻找干净的东西。

【问题讨论】:

    标签: regex string perl character


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      您可以改用tr

             $p =~ tr/fo//d;
      

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

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

      Perl's tr documentation

      tr/SEARCHLIST/REPLACEMENTLIST/cdsr

      将在搜索列表中找到的所有字符(如果指定了/c 修饰符,则未找到)与替换列表中位置对应的字符进行音译,可能会删除一些,具体取决于指定的修饰符。

      […]

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

      【讨论】:

        【解决方案3】:

        有了这么大的角色类别,更容易说出你想要保留的内容。字符类的第一个位置的插入符号颠倒了它的意义,所以你可以写

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

        或者,使用更高效的tr

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

        tr docs

        【讨论】:

          【解决方案4】:

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

          你拿那个字符串,叫它$place_older说。然后当你想删除文本时,你调用quotemeta,然后你用那个值来代替:

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

          【讨论】:

          • 这将反斜杠所有非单词字符。当我只想删除一组特定的字符时,这将不起作用。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-10
          • 1970-01-01
          • 2015-10-02
          • 1970-01-01
          • 1970-01-01
          • 2021-06-01
          相关资源
          最近更新 更多