Regex und die Zeichen Fall
Frage
Okay, habe ich eine ziemlich einfache (zumindest scheint einfach). Ich habe einen Multi-String gefüttert und ich bin gerade mit dem Ersetzen verschiedene Worte mit etwas anderem herumspielen. Lassen Sie mich Ihnen ...
#!/usr/bin/perl -w
use strict;
$_ = "That is my coat.\nCoats are very expensive.";
s/coat/Hat/igm;
print;
Der Ausgang wäre
That is my Hat
Hats are very expensive...
Der „Hut“ auf der ersten Zeile nicht aktiviert werden soll. Gibt es irgendwelche Tricks, die das Gehäuse kompatibel mit wie Englisch geschrieben machen? Danke:)
Lösung
finden Sie unter how-to-replace-string -and-preserve-its-Groß-Klein
Für weitere Details gehen Sie zu Wie ersetzen I Fall unsensibel auf der LHS, während auf dem RHS Fall zu bewahren?
Andere Tipps
Sie können den e
Modifikator s///
verwenden den Trick zu tun:
s/(coat)/ucfirst($1) eq $1 ? 'Hat' : 'hat'/igme;
Zum einen sollten Sie \b
(Wortgrenze) nur das ganze Wort entsprechen. s/hat/coat/
würde That
zum Beispiel ohne führenden Tcoat
zu \b
ändern. Nun zu Ihrer Frage. Mit der Flagge /e
können Sie Perl-Code in dem Ersatzteil des Regex verwenden. So haben Sie eine Perl-Funktion schreiben kann, dass die Kontrollen der Fall des Spiels und dann den Fall des Ersatz richtig eingestellt:
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;
}
}
Prints:
That is my hat.
Hats are very expensive.
Dies kann Ihr Problem lösen:
#!/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";