如何删除字符串的最后两次“ - ”字符?

时间:2013-07-08 12:30:13

标签: regex perl

我有一个字符串数组,格式如下:

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

我想仅删除最后两个“ - ”符号(从原始字符串的日期部分开始),以便不改变药物名称(Ado-trastuzumab emtansine)。现在我的正则表达式删除所有“ - ”符号:

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

我希望输出代替以下内容:

Ado-trastuzumab emtansine(HER2)02222013

感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

您可以使用substr作为左值,仅将音译应用于字符串的特定部分:

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

在这种情况下,在字符串的最后10个字母上。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

要按照字面意思执行操作 - 从字符串中删除最后两个连字符 - 您可以写这个

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

但在这种情况下,您只需删除数字后面的所有连字符:

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

答案 3 :(得分: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解决方案应该快得多。对于短字符串,请考虑可读性。