我有这样的字符串:
trn_425374_1_94_-
trn_12_1_200_+
trn_2003_2_198_+
我希望在第一个数字后分割所有数字,如下所示:
trn_425374
trn_12
trn_2003
我尝试了以下代码:
$string =~ s/(?<=trn_\d)\d+//gi;
但返回与输入相同。我一直在关注类似问题的例子,但我不知道我做错了什么。有什么建议吗?
答案 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中使用模式,则不会被替换 取代