2010-08-12 4 views
0

Bon, j'ai un assez simple (au moins semble simple). J'ai une corde multi-rayée et je suis juste en train de jouer avec le remplacement de mots différents avec autre chose. Laissez-moi vous montrer ...Regex et le cas de caractères

#!/usr/bin/perl -w 
use strict; 

$_ = "That is my coat.\nCoats are very expensive."; 
s/coat/Hat/igm; 
print; 

La sortie serait
That is my Hat
Hats are very expensive...

Le "chapeau" sur la première ligne ne devrait pas être capitalisés. Y at-il des astuces qui peuvent rendre le boîtier conforme à la façon dont l'anglais est écrit? Merci :)

+0

Je suppose que vous ne travaillez pas dans l'industrie des peintures et revêtements? :) –

+0

tout d'abord, n'utilisez pas le modificateur i, si vous voulez sensible à la casse. –

+0

Vous devez définir votre étendue. Prévoyez-vous l'utiliser sur * beaucoup * de mots? – Zaid

Répondre

1

Pour un, vous devez utiliser \b (limite de mot) pour correspondre uniquement au mot entier. Par exemple, s/hat/coat/ changerait That en Tcoat sans indiquer \b. Maintenant pour votre question. Avec le drapeau /e vous pouvez utiliser le code Perl dans la partie de remplacement de la regex. Ainsi, vous pouvez écrire une fonction Perl qui vérifie le cas du match, puis régler le cas du remplacement correctement:

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. 
4

Vous pouvez utiliser le modificateur e-s/// à faire l'astuce:

s/(coat)/ucfirst($1) eq $1 ? 'Hat' : 'hat'/igme; 
+1

Pas une solution complète, mais il couvre 'manteau' et 'Hat' – Axeman

+0

Solution intelligente! – David

0

Cela peut résoudre votre problème:


#!/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"; 
Questions connexes