1

我有这样的字符串:

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

4 回答 4

3

如果您正在运行 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;
于 2013-08-03T12:31:52.230 回答
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
于 2013-08-03T10:27:38.267 回答
0

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

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

引用上面的链接:

\K

这出现在 perl 5.10.0 中。在 \K 左侧匹配的任何内容都不包含在 $& 中,并且如果在替换中使用该模式,则不会被替换。

于 2013-08-03T11:32:14.807 回答
0

你的正则表达式应该是:

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

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

于 2013-08-03T10:32:21.017 回答