Bạn có thể sử dụng perl
. Trực tiếp từ faq - trích dẫn từ perldoc perlfaq6
:
Làm cách nào để thay thế trường hợp không nhạy cảm với LHS trong khi bảo quản trường hợp trên RHS?
Đây là một giải pháp Perlish đáng yêu của Larry Rosler. Nó khai thác các thuộc tính của bitwise xor trên chuỗi 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;
Và đây là một chương trình con, được mô phỏng theo cách trên:
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";
Bản in này:
this is a SUcCESS case
Thay vào đó, để giữ trường hợp của từ thay thế nếu nó dài hơn từ gốc, bạn có thể sử dụng mã này, bởi 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);
}
Điều này thay đổi câu thành "đây là trường hợp SUcCess."
Chỉ cần chỉ ra rằng các lập trình viên C có thể viết C bằng bất kỳ ngôn ngữ lập trình nào, nếu bạn thích một giải pháp giống C hơn, tập lệnh sau đây làm cho sự thay thế có cùng trường hợp, từng chữ cái, như bản gốc. (Nó cũng xảy ra để chạy chậm hơn khoảng 240% so với giải pháp Perlish chạy.) Nếu thay thế có nhiều ký tự hơn chuỗi được thay thế, trường hợp của ký tự cuối cùng được sử dụng cho phần còn lại của thay thế.
# 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
?