2013-07-25 6 views
4

Disons que je suis en train de faire correspondre une URL avec des expressions régulières:Remplacer modèle avec un espace par caractère en Perl

$text = 'http://www.google.com/'; 
$text =~ /\bhttp:\/\/([^\/]+)/; 
print $1; # It prints www.google.com 

Je voudrais remplacer le motif qu'elle correspond à un espace pour chaque caractère dans ce . Par exemple, compte tenu de l'exemple ci-dessus, je voudrais finir avec ce texte:

# http://   /

est-il un moyen simple de le faire? Connaître le nombre de caractères du motif correspondant et le remplacer par le même nombre de caractères différents?

Merci.

+1

** Cela peut ne pas être un travail pour les expressions rationnelles, mais pour les outils existants dans la langue de votre choix. ** Les expressions régulières ne sont pas une baguette magique que vous manipulez à chaque problème. Vous voulez probablement utiliser du code existant qui a déjà été écrit, testé et débogué. En PHP, utilisez la fonction ['parse_url'] (http://php.net/manual/fr/function.parse-url.php). Perl: [module 'URI'] (http://search.cpan.org/dist/URI/). Ruby: [module 'URI'] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html). .NET: ['Uri' class] (http://msdn.microsoft.com/fr-fr/library/txt7706a.aspx) –

+0

La chose URL était juste un exemple. Ce que je devais vraiment savoir, c'était comment remplacer un motif par autant de caractères du motif lui-même. Par exemple, cela pourrait également être utilisé pour masquer un numéro de carte de crédit ou quelque chose comme ça (xxxxxxxxxxxx1234). Merci pour votre participation. – calvillo

Répondre

6

Une façon simple est:

$text =~ s!\b(http://)([^/]+)!$1 . " " x length($2)!e; 

Le regexp \b(http://)([^/]+) correspond à une limite de mot, la chaîne littérale http://, et un ou plusieurs caractères non-slash, la capture http:// dans $1 et les caractères non-slash dans $2 . (Notez que je l'ai utilisé ! comme séparateur de regexp ci-dessus au lieu de l'habituel / pour éviter leaning toothpick syndrome.)

Le commutateur e à la fin de l'opérateur s/// provoque la substitution $1 . " " x length($2) à évaluer code Perl au lieu d'être interprété comme une chaîne. Il est donc évalué à $1 suivi d'autant d'espaces qu'il y a de lettres dans $2.

+2

post-v10, vous pouvez utiliser l'opérateur regex '\ K' pour éviter une capture inutile:' s! \ Bhttp: // \ K ([^ /] +)! "" X longueur ($ 1)! E'. Cela raccourcit un peu l'expression rationnelle. – amon

+0

C'est très impressionnant! Je ne savais même pas que l'opérateur "x" existait. Merci beaucoup. – calvillo

Questions connexes