Perl:删除模式后的一部分字符串

时间:2013-08-03 10:23:23

标签: regex string perl split

我有这样的字符串:

trn_425374_1_94_-
trn_12_1_200_+
trn_2003_2_198_+

我希望在第一个数字后分割所有数字,如下所示:

trn_425374
trn_12
trn_2003

我尝试了以下代码:

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

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

请注意,这些都不会删除任何尾随的换行符。如果你想剥离它们,那么首先chomp字符串,或者将/s修饰符添加到替换中,如下所示

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

你的正则表达式应该是:

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

它以1美元(这是你要保留的字符串部分)代替整个匹配。

答案 3 :(得分:0)

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

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

引用上面的链接:

  

     

这出现在perl 5.10.0中。 \ K左边的任何东西都没有   包括在$&amp; ,如果在a中使用模式,则不会被替换   取代