1

次のようにフォーマットされた文字列の配列があります。

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

薬の名前 (Ado-trastuzumab emtansine) が変更されないように、最後の 2 つの "-" 記号のみ (元の文字列の日付部分から) を削除したいと思います。現在、私の正規表現はすべての「-」記号を削除しています。

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

代わりに出力を次のようにしたいと思います。

Ado-trastuzumab emtansine(HER2)02222013

助けてくれてありがとう!

4

4 に答える 4

4

左辺値として使用substrして、文字列の特定の部分にのみ音訳を適用できます。

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

この場合、文字列の最後の 10 文字です。

于 2013-07-08T12:38:10.070 に答える
0

1 つしかないときに何もしない場合-:

$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+

これらはすべて、1 つしかない場合でも機能し-ます。

$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ソリューションははるかに高速になります。短い文字列の場合は、読みやすさを重視してください。

于 2013-07-08T13:04:46.347 に答える