2013-07-08 4 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 как Lvalue применять только транслитерации к определенной части вашей строки:

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

изменил мой ответ :) спасибо за ссылку –

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 решения должны быть гораздо быстрее. Для коротких строк читайте.

Смежные вопросы