我有这样的条件:
trn_425374_1_94_-
trn_12_1_200_+
trn_2003_2_198_+我想在第一个数字之后把它们分开,就像这样:
trn_425374
trn_12
trn_2003我尝试了以下代码:
$string =~ s/(?<=trn_\d)\d+//gi;但返回与输入相同的内容。我一直在跟踪类似问题的例子,但我不知道自己做错了什么。有什么建议吗?
发布于 2013-08-03 10:27:38
进行分组以保存找到的第一位数,并使用.*从其中删除到行尾:
#!/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-03 12:31:52
如果您正在运行Perl 5版本10或更高版本,那么您可以访问\K (“保存”)正则表达式转义。\K之前的所有内容都被排除在替换之外,因此这将删除第一个数字序列之后的所有内容(换行符除外)。
s/\d+\K.+//;使用早期版本的Perl,您必须捕获要保留的字符串的一部分,并在替换中替换它。
s/(\D*\d+).+/$1/;请注意,这两种方法都不会删除任何尾随换行符。如果您也想去掉这些字符串,那么要么先chomp字符串,要么将/s修饰符添加到替换中,如下所示
s/\d+\K.+//s;或
s/(\D*\d+).+/$1/s;发布于 2013-08-03 10:32:21
您的regexr应该是:
$string =~ s/(trn_\d+).*/$1/g;它将整个匹配替换为$1 (这是要保留的字符串部分)。
https://stackoverflow.com/questions/18031804
复制相似问题