Regex и случай персонажей
Вопрос
Хорошо, я получил довольно простой (по крайней мере, кажется простым). У меня есть многолированная строка, и я просто играю с заменой разных слов с чем-то другим. Позволь мне показать тебе...
#!/usr/bin/perl -w
use strict;
$_ = "That is my coat.\nCoats are very expensive.";
s/coat/Hat/igm;
print;
Выход будет
That is my Hat
Hats are very expensive...
«Шляпа» на первой строке не должна быть заглавна. Есть ли какие-то трюки, которые могут создать корпус соответствовать тем, как написано английский? Спасибо :)
Решение
видеть как-заменить-строку и заповедник - прописная строчная
Для более подробной информации перейти к Как мне заместите случай безментенциайно на LHS, сохраняя дело на RH?
Другие советы
Вы можете использовать e
модификатор к s///
сделать трюк:
s/(coat)/ucfirst($1) eq $1 ? 'Hat' : 'hat'/igme;
Для одного вы должны использовать \b
(Слово граница), чтобы соответствовать только всем слову. Например s/hat/coat/
изменилось бы That
к Tcoat
без ведущего \b
. Отказ Теперь на ваш вопрос. С флагом /e
Вы можете использовать код PERL в запасной части Regex. Таким образом, вы можете написать функцию Perl, которая проверяет случай матча, а затем правильно установить корпус замены:
my $s = "That is my coat.\nCoats are very expensive.";
$s =~ s/(\bcoat)/&same_case($1, "hat")/igme;
print $s, "\n";
sub same_case {
my ($match, $replacement) = @_;
# if match starts with uppercase character, apply ucfirst to replacement
if($match =~ /^[A-Z]/) {
return ucfirst($replacement);
}
else {
return $replacement;
}
}
Печать:
That is my hat.
Hats are very expensive.
Это может решить вашу проблему:
#!/usr/bin/perl -w
use strict;
sub smartSubstitute {
my $target = shift;
my $pattern = shift;
my $replacement = shift;
$pattern = ucfirst $pattern;
$replacement = ucfirst $replacement;
$target =~ s/$pattern/$replacement/gm;
$pattern = lcfirst $pattern;
$replacement = lcfirst $replacement;
$target =~ s/$pattern/$replacement/gm;
return $target;
}
my $x = "That is my coat.\nCoats are very expansive.";
my $y = smartSubstitute($x, "coat", "Hat");
print $y, "\n";