fossilz
fossilz

Reputation: 337

Replace digits between 2 and 8 in length with specific character using regex

We have a security issue where a specific field in a database has some sensitive information in it. I need a way to detect numbers that are between 2 and 8 in length, replace the digits with a "filler" of the same length.

For instance:

Jim8888Dandy
Mike9999999999Thompson * Note: this is 10 in length and we don't want to replace the digits
123Area Code
Tim Johnson5555555

In these instances anytime we find a number that is between 2 and 8 (inclusive) then I want to replace/fill/substitute that value with the number 0 and keep the length of the original digits

End Result

   Jim0000Dandy
   Mike9999999999Thompson
   000Area Code
   Tim Johnson0000000

Is there an easy way to accomplish this using RegEx?

Upvotes: 3

Views: 1350

Answers (2)

Szymon
Szymon

Reputation: 43023

You need to provide a static evaluator method that would do the replacing. It replaces digits in the match with zeroes:

public static string Evaluate(Match m)
{
     return Regex.Replace(m.Value, "[0-9]", "0");
}

And then use it with this code:

string input = "9999999099999Thompson534543";
MatchEvaluator evaluator = new MatchEvaluator(Program.Evaluate);
string replaced = Regex.Replace(input, "(?:^|[^0-9])[0-9]{2,8}(?:$|[^0-9])", evaluator);

The regex is:

  • (?:^|[^0-9]) - should be at the start or preceeded by non-digit
  • [0-9]{2,8} - the to capture between 2 and 8 digits
  • (?:$|[^0-9]) - should be at the end or followed by non-digit

Upvotes: 2

Unihedron
Unihedron

Reputation: 11041

Just for the clever regex department. This is not an efficient regex.

(?<=(?>(?'front'\d){0,7}))\d(?=(?'back'(?'-front'\d)){0,7}(?!\d))((?'-front')|(?'-back'))

Replace to 0.

/(?<=(?>(?'front'\d){0,7})) # Measure how many digits we're behind.
  \d # This digit is matched
  (?=
    (?'back' # Measure how many digits we're in front of.
      (?'-front'\d)){0,7}
      # For every digit here, subtract one group from 'front',
      # As to assert we'll never go over the < 8 digit requirement.
  (?!\d) # no more digits
  )
 (
  (?'-front') # At least one capturing group left for 'front' or 'back'
 |(?'-back')  # for > 2 digits requirement.
 )/x

Upvotes: 0

Related Questions