by johngg (Abbot)
 on May 16, 2012 at 07:24 UTC ( #970762=note: print w/replies, xml ) Need Help??

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, \$_->[ 1 ], 0, \$_->[ 0 ] for reverse @seps;
> say \$num;'
17403 4893 18345-973409
17403 4XXX XXXXX-XX3409
knoppix@Microknoppix:~\$

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, \$_->[ 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'.
by Anonymous Monk on May 16, 2012 at 07:39 UTC

Thnks, but can u plz explain it

Create A New User
Node Status?
node history
Node Type: note [id://970762]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (10)
As of 2017-06-26 12:33 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
How many monitors do you use while coding?

Results (580 votes). Check out past polls.