我有一个字符串数组,格式如下:
Ado-trastuzumab emtansine(HER2)02-22-2013
我想仅删除最后两个“ - ”符号(从原始字符串的日期部分开始),以便不改变药物名称(Ado-trastuzumab emtansine)。现在我的正则表达式删除所有“ - ”符号:
foreach my $string (@array) {
$string =~ tr/-//d;
}
我希望输出代替以下内容:
Ado-trastuzumab emtansine(HER2)02222013
感谢您的帮助!
答案 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
解决方案应该快得多。对于短字符串,请考虑可读性。