2013-07-08 114 views
1

我有一個字符串數組格式化爲這樣:如何刪除字符串的最後兩個「 - 」字符?

Ado-trastuzumab emtansine(HER2)02-22-2013 

我想刪除最後兩個「 - 」僅(從原來的字符串的日期部分)的符號,這樣的名字藥物(Ado-trastuzumab emtansine)未被改變。現在我正則表達式刪除所有「 - 」符號:

foreach my $string (@array) { 
    $string =~ tr/-//d; 
} 

我想輸出,而不是爲以下:

Ado-trastuzumab emtansine(HER2)02222013 

感謝您的幫助!

+1

這不是最後兩個''''嗎? – aschepler

+0

是的,謝謝。 – user2560686

回答

4

可以使用substr當作左值的音譯只適用於你的字符串的特定部分:

substr($string, -10, 10) =~ tr/-//d; 

在這種情況下,在字符串的最後10個字母。

+0

感謝您的幫助!很高興知道substr函數。 – user2560686

+0

不客氣。是的,它是一個有用的技巧要知道。 – TLP

1
foreach my $string (@array) { 
    $string =~ s/(\d{2})-(\d{2})-(\d{4})$/$1$2$3/; 
} 
+0

請*不要*使用'\ 1'等'$ 1'是引用捕獲的正確形式。 ['perlre'有一個特定的警告](http://perldoc.perl.org/perlre.html#Warning-on-%5c1-Instead-of-%241) – Borodin

+0

改變了我的答案:)感謝您的鏈接 – 2013-07-08 12:45:21

1

要做到你說的話字面上 - 從字符串刪除最後兩個連字符 - 你可以寫這個

$string =~ s/-([^-]*)-([^-]*)\z/$1$2/; 

但在這種情況下,你可以簡單地刪除遵循一個數字的所有連字符:

$string =~ s/\d\K-//g; 
0

如果在只有一個-什麼應該做的事:

$s =~ s/-([^-]*)-([^-]*)\z/$1$2/; 

$s = reverse($s); 
$s =~ s/^([^-]*)-([^-]*)-/$1$2/; 
$s = reverse($s); 

$s = reverse(reverse($s) =~ s/^([^-]*)-([^-]*)-/$1$2/r); # 5.14+ 

所有這些工作,即使只有一個-

$s =~ s/-([^-]*)(?:-([^-]*))?\z/$1$2/; 

$s =~ s/-([^-]*)\z/$1/ for 1..2; 

$s =~ s/^.*\K-//s for 1..2; 

$s = reverse($s); 
$s =~ s/-// for 1..2; 
$s = reverse($s); 

$s = reverse($s); 
$s =~ s/^([^-]*)-(?:([^-]*)-)?/$1$2/; 
$s = reverse($s); 

$s = reverse(reverse($s) =~ s/^([^-]*)-(?:([^-]*)-)?/$1$2/r); # 5.14+ 

對於長字符串,則reverse解決方案要快很多。對於短字符串,請閱讀。

相關問題