2013-08-03 29 views
1

後刪除字符串的一部分,我有一個字符串是這樣的:的Perl:模式

trn_425374_1_94_- 
trn_12_1_200_+ 
trn_2003_2_198_+ 

我想第一個數字畢竟分裂,就像這樣:

trn_425374 
trn_12 
trn_2003 

我嘗試以下代碼:

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

但返回與輸入相同。我一直在跟蹤類似問題的例子,但我不知道我做錯了什麼。任何建議?

回答

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 
0

您regexr應該是:

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

它通過記憶在$ 1替代整場比賽(這是串部分要保留)

0

使用\K保存字符串的一部分,你想保持:

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

引述上面的鏈接:

這出現在perl 5.10.0。任何與\ K左邊相匹配的內容不是 包含在$ &中,並且如果該模式用於替代 ,則不會被替換。

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;