【问题标题】:Perl: remove a part of string after patternPerl:在模式后删除部分字符串
【发布时间】:2013-08-04 14:30:08
【问题描述】:

我有这样的字符串:

trn_425374_1_94_-
trn_12_1_200_+
trn_2003_2_198_+

我想在第一个数字之后全部拆分,如下所示:

trn_425374
trn_12
trn_2003

我尝试了以下代码:

$string =~ s/(?<=trn_\d)\d+//gi;

但返回与输入相同。我一直在关注类似问题的例子,但我不知道我做错了什么。有什么建议吗?

【问题讨论】:

    标签: regex string perl split


    【解决方案1】:

    如果您运行的是 Perl 5 版本 10 或更高版本,那么您可以访问 \K ("keep") 正则表达式转义。 \K 之前的所有内容都被排除在替换之外,因此这会删除第一个数字序列之后的所有内容(换行符除外)

    s/\d+\K.+//;
    

    对于早期版本的 Perl,您必须捕获要保留的字符串部分,并在替换中替换它

    s/(\D*\d+).+/$1/;
    

    请注意,这些都不会删除任何尾随换行符。如果你也想去掉这些,那么要么先 chomp 字符串,要么将 /s 修饰符添加到替换中,像这样

    s/\d+\K.+//s;
    

    s/(\D*\d+).+/$1/s;
    

    【讨论】:

      【解决方案2】:

      进行分组以保存找到的第一个数字并使用.*从那里删除直到行尾:

      #!/usr/bin/env perl
      
      use warnings;
      use strict;
      
      while ( <DATA> ) { 
          s/(\d+).*$/$1/ && print;
      }
      
      __DATA__
      trn_425374_1_94_-
      trn_12_1_200_+
      trn_2003_2_198_+
      

      它产生:

      trn_425374
      trn_12
      trn_2003
      

      【讨论】:

        【解决方案3】:

        你的正则表达式应该是:

        $string =~ s/(trn_\d+).*/$1/g;
        

        它将整个匹配替换为 $1 处的记忆(这是您要保留的字符串部分)

        【讨论】:

          【解决方案4】:

          使用\K 保留你想要保留的字符串部分:

          $string =~ s/trn_\d+\K.*//;
          

          引用上面的链接:

          \K

          这出现在 perl 5.10.0 中。 \K 左侧匹配的任何内容都不是 包含在 $& 中,如果模式用于 替换。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-12
            • 1970-01-01
            • 2022-07-12
            相关资源
            最近更新 更多