我有这样的字符串:
trn_425374_1_94_-
trn_12_1_200_+
trn_2003_2_198_+
我想在第一个数字之后全部拆分,如下所示:
trn_425374
trn_12
trn_2003
我尝试了以下代码:
$string =~ s/(?<=trn_\d)\d+//gi;
但返回与输入相同。我一直在关注类似问题的例子,但我不知道我做错了什么。有什么建议吗?
如果您正在运行 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;
进行分组以保存找到的第一个数字并用于.*
从那里删除直到行尾:
#!/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
用于\K
保留要保留的字符串部分:
$string =~ s/trn_\d+\K.*//;
引用上面的链接:
\K
这出现在 perl 5.10.0 中。在 \K 左侧匹配的任何内容都不包含在 $& 中,并且如果在替换中使用该模式,则不会被替换。
你的正则表达式应该是:
$string =~ s/(trn_\d+).*/$1/g;
它用 $1 处的记忆替换整个匹配(这是您要保留的字符串部分)