2009-06-13 11 views
2

Ich möchte einen regulären Ausdruck verwenden, um alle bis auf die ersten drei alphanumerischen Zeichen jedes Worts in einer Zeichenfolge mit einem Maskenzeichen (wie "x") zu maskieren, also "1 Buckingham Palace Road, London "würde" 1 Bucxxxxxxx Palxxx Roax, Lonxxx "werden.Regulärer Ausdruck zum Maskieren von Zeichenfolgen mit Zeichensatzersetzung

die ersten drei Zeichen zu halten, ist leicht

s/\b(\w{0,3})(.*)\b/$1/g 

mit getan, aber ich kann nicht scheinen, um herauszufinden, wie Länge einzufügen ($ 2) mal die Maskierungszeichen anstelle von 2 $.

Danke!

Antwort

0
use warnings; 
use strict; 

my $string = "1 Buckingham Palace Road, London"; 

$string =~ s(
    \b(\w{0,3})(\w*)\b 
){ 
    $1 . ('x' x length $2) 
}gex; 

print $string, "\n"; 
4

C#:

new Regex(@"(?<!\b.{0,2}).").Replace("1 Buckingham Palace Road, London", "x"); 

Da Sie sagen, es ist sprachunabhängig, ich vertrauen diese einfach in der Sprache Ihrer Wahl portiert werden können ...

Oder könnten Sie nur die Länge von $ 2 erhalten und fülle das X auf die altmodische Weise.

+0

Hervorragende Lösung. +1 für die Verwendung von negativem Lookbehind. –

+0

Sieht gut aus. Offensichtlich ist das Problem nicht so sprachunabhängig, wie ich ursprünglich gedacht habe, da Perl anscheinend kein Lookback mit variabler Länge implementiert (aber C# tut es). Ich werde versuchen, herauszufinden, wie ich das heute später umgehen soll. –

1

Positive Lookbehind jede Wortzeichen mit drei Wortzeichen, bevor es zu einem X geändert wird:

s/(? < = \ w {3}) \ w/$ 1x/g;

Beispiel Perl-Skript:

my $string = "1 Buckingham Palace Road, London"; 
$string =~ s/(?<=\w{3})\w/$1x/g; 
print qq($string\n); 
+1

Besser geschrieben als $ string = ~ s/((? <= \ W {3}) \ w)/$ 1x/g, um Warnungen wie "Verwendung von nicht initialisiertem Wert $ 1 in Verkettung (.) ..." für jeden zu unterdrücken Replacement. –

+1

's/(? <= \ W {3}) \ w/x/g' (Anmerkung: keine' $ 1') – jfs

Verwandte Themen