Как к строке замены и сохраняют ее верхний регистр/нижний регистр

Я хочу заменить одну строку другим в Perl; оба имеют ту же длину. Я хочу заменить все случаи (нечувствительной к регистру) строки, но я хочу это, случай буквы будет сохранен. Таким образом, если первая буква была верхним регистром, первая буква после того, как замена будет верхним регистром также.

Например, если я хочу заменить "нечто" "панелью", таким образом, я хочу это

foo ==> bar
Foo ==> Bar
FOO ==> BAR

Существует ли простой способ сделать это в Perl?

9
задан Peter Mortensen 21 August 2016 в 20:59
поделиться

3 ответа

Это может быть то, что вам нужно:

Как мне заменить регистр без учета регистра в LHS, сохранив регистр в RHS?

Это практически скопировано из приведенной выше ссылки:

sub preserve_case($$) {
    my ($old, $new) = @_;
    my $mask = uc $old ^ $old;
    uc $new | $mask .
    substr($mask, -1) x (length($new) - length($old))
}

my $string;

$string = "this is a Foo case";
$string =~ s/(Foo)/preserve_case($1, "bar")/egi;
print "$string\n";

# this is a Bar case

$string = "this is a foo case";
$string =~ s/(Foo)/preserve_case($1, "bar")/egi;
print "$string\n";

# this is a bar case

$string = "this is a FOO case";
$string =~ s/(Foo)/preserve_case($1, "bar")/egi;
print "$string\n";

# this is a BAR case
13
ответ дан 4 December 2019 в 06:06
поделиться

Вы знаете, что каждая строка имеет одинаковую длину, поэтому, в принципе, вы можете:

index = Pos(string, oldString)
for i = index to index + strlen(oldString)
  if (oldString[i] >= 'a') && (oldString[i] <= 'z'')
    string[i] = ToLower(newString[i])
  else
    string[i] = ToUpper(newString[i])0x20
1
ответ дан 4 December 2019 в 06:06
поделиться

Посимвольная проверка. Если значение ASCII символа попадает в значения ASCII верхнего регистра, замените его на верхний регистр, иначе на нижний регистр.

0
ответ дан 4 December 2019 в 06:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: