後刪除字符串的一部分,我有一個字符串是這樣的:的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;
但返回與輸入相同。我一直在跟蹤類似問題的例子,但我不知道我做錯了什麼。任何建議?
後刪除字符串的一部分,我有一個字符串是這樣的:的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;
但返回與輸入相同。我一直在跟蹤類似問題的例子,但我不知道我做錯了什麼。任何建議?
待辦事項分組保存的發現數字第一號和使用.*
刪除從那裏,直到行尾:
#!/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
您regexr應該是:
$string =~ s/(trn_\d+).*/$1/g;
它通過記憶在$ 1替代整場比賽(這是串部分要保留)
使用\K
保存字符串的一部分,你想保持:
$string =~ s/trn_\d+\K.*//;
引述上面的鏈接:
\ķ
這出現在perl 5.10.0。任何與\ K左邊相匹配的內容不是 包含在$ &中,並且如果該模式用於替代 ,則不會被替換。
如果您運行Perl 5版本10或更高版本,那麼您可以訪問\K
(「保留」)正則表達式轉義。在\K
之前,一切都從替代排除,所以這消除數字的第一序列之後的一切(除換行符)
s/\d+\K.+//;
與早期版本的Perl,你將不得不捕獲字符串的一部分,你想要保留,並替換它中的替換
s/(\D*\d+).+/$1/;
請注意,這些都不會刪除任何結尾的換行符。如果您想要去除那些爲好,那麼無論chomp
字符串第一或/s
改性劑添加到替代,這樣
s/\d+\K.+//s;
或
s/(\D*\d+).+/$1/s;