Regex e il caso caratteri
Domanda
Va bene, ho un piuttosto semplice (almeno sembra semplice). Ho una stringa a più allineati e sto solo giocando intorno con la sostituzione parole diverse con qualcos'altro. Lasciate che vi mostri ...
#!/usr/bin/perl -w
use strict;
$_ = "That is my coat.\nCoats are very expensive.";
s/coat/Hat/igm;
print;
L'uscita sarebbe
That is my Hat
Hats are very expensive...
Il "cappello" sulla prima linea non deve essere in maiuscolo. Ci sono dei trucchi che possono rendere il compliant involucro con il modo in inglese è stato scritto? Grazie:)
Soluzione
vedere how-to-replace-string -e-preservare la-sua-maiuscolo-minuscolo
Per maggiori dettagli consultare il sito Come faccio a sostituire caso insensitively sulle LHS preservando caso sulla RHS?
Altri suggerimenti
È possibile utilizzare il modificatore e
a s///
di fare il trucco:
s/(coat)/ucfirst($1) eq $1 ? 'Hat' : 'hat'/igme;
Per uno, si dovrebbe usare \b
(limite di parola) per corrispondere solo l'intera parola. Per esempio s/hat/coat/
cambierebbe That
a Tcoat
senza portare \b
. Ora per la tua domanda. Con il /e
bandiera è possibile utilizzare il codice Perl nel pezzo di ricambio della regex. Così si può scrivere una funzione Perl che controlli il caso della partita e quindi impostare il caso di sostituzione correttamente:
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;
}
}
Stampe:
That is my hat.
Hats are very expensive.
Questo potrebbe risolvere il problema:
#!/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";