Anda bisa menggunakannya perl
. Langsung dari faq - mengutip dari perldoc perlfaq6
:
Bagaimana cara mengganti case-insensitive pada LHS sambil mempertahankan case pada RHS?
Inilah solusi Perlish yang bagus dari Larry Rosler. Ini mengeksploitasi properti bitwise xor pada string ASCII.
$_= "this is a TEsT case";
$old = 'test';
$new = 'success';
s{(\Q$old\E)}
{ uc $new | (uc $1 ^ $1) .
(uc(substr $1, -1) ^ substr $1, -1) x
(length($new) - length $1)
}egi;
print;
Dan ini dia sebagai subrutin, dimodelkan seperti di atas:
sub preserve_case($$) {
my ($old, $new) = @_;
my $mask = uc $old ^ $old;
uc $new | $mask .
substr($mask, -1) x (length($new) - length($old))
}
$string = "this is a TEsT case";
$string =~ s/(test)/preserve_case($1, "success")/egi;
print "$string\n";
Ini mencetak:
this is a SUcCESS case
Sebagai alternatif, untuk menjaga huruf pengganti kata jika lebih panjang dari aslinya, Anda dapat menggunakan kode ini, oleh Jeff Pinyan:
sub preserve_case {
my ($from, $to) = @_;
my ($lf, $lt) = map length, @_;
if ($lt < $lf) { $from = substr $from, 0, $lt }
else { $from .= substr $to, $lf }
return uc $to | ($from ^ uc $from);
}
Ini mengubah kalimat menjadi "ini adalah kasus SUcCess."
Hanya untuk menunjukkan bahwa pemrogram C dapat menulis C dalam bahasa pemrograman apa pun, jika Anda lebih suka solusi yang lebih mirip C, skrip berikut membuat substitusi memiliki kasus yang sama, huruf per huruf, seperti aslinya. (Ini juga terjadi untuk menjalankan sekitar 240% lebih lambat daripada berjalan solusi Perlish.) Jika substitusi memiliki karakter lebih dari string yang diganti, kasus karakter terakhir digunakan untuk sisa substitusi.
# Original by Nathan Torkington, massaged by Jeffrey Friedl
#
sub preserve_case($$)
{
my ($old, $new) = @_;
my ($state) = 0; # 0 = no change; 1 = lc; 2 = uc
my ($i, $oldlen, $newlen, $c) = (0, length($old), length($new));
my ($len) = $oldlen < $newlen ? $oldlen : $newlen;
for ($i = 0; $i < $len; $i++) {
if ($c = substr($old, $i, 1), $c =~ /[\W\d_]/) {
$state = 0;
} elsif (lc $c eq $c) {
substr($new, $i, 1) = lc(substr($new, $i, 1));
$state = 1;
} else {
substr($new, $i, 1) = uc(substr($new, $i, 1));
$state = 2;
}
}
# finish up with any remaining new (for when new is longer than old)
if ($newlen > $oldlen) {
if ($state == 1) {
substr($new, $oldlen) = lc(substr($new, $oldlen));
} elsif ($state == 2) {
substr($new, $oldlen) = uc(substr($new, $oldlen));
}
}
return $new;
}
ABcDeF
?