in reply to numbers masking
Take the separators out, preserving them and their offset adjusted for their position as it would be in the number without them. Then do the masking and, finally, put them back.
knoppix@Microknoppix:~$ perl -E ' > $num = q{17403 4893 18345-973409}; > say $num; > $sepCt = 0; > push @seps, [ $1, $-[ 0 ] - $sepCt ++ ] while $num =~ m{(\D)}g; > $num =~ s{\D}{}g; > $maskLen = length( $num ) - 10; > substr $num, 6, $maskLen, q{X} x $maskLen; > substr $num, $_->[ 1 ], 0, $_->[ 0 ] for reverse @seps; > say $num;' 17403 4893 18345-973409 17403 4XXX XXXXX-XX3409 knoppix@Microknoppix:~$
I hope this is helpful.
Update: This can be simplified. The adjustment of position and replacement of separators in reverse order is not necessary. Separators can be put back into the string from left to right as, once one has been put back in, the rest of the string has been moved one character to the right so the next position is already correct without adjustment.
knoppix@Microknoppix:~$ perl -E ' $num = q{17403 4893 18345-973409}; say $num; push @seps, [ $1, $-[ 0 ] ] while $num =~ m{(\D)}g; $num =~ s{\D}{}g; $maskLen = length( $num ) - 10; substr $num, 6, $maskLen, q{X} x $maskLen; substr $num, $_->[ 1 ], 0, $_->[ 0 ] for @seps; say $num;' 17403 4893 18345-973409 17403 4XXX XXXXX-XX3409 knoppix@Microknoppix:~$
Breaking this down as requested by Anonymonk.
Match, capture and record the position of all non-digits in the string
Remove all non-digits from the string
Mask all but the first six and last four digits
Insert the non-digits back into the string in their recorded positions
Update 2: Clarified (I hope) the wording of the first update.
Cheers,
JohnGG
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^2: numbers masking
by Anonymous Monk on May 16, 2012 at 07:39 UTC |