'Regex to replace all password with ***

I have the following json:

Data: {"Account":"d\\adm","Password":"cWExZjEiMTM="},"SqlServer":{"InstanceName":"","MachineName":"MyMachine","Port":null}

I would like to use RegExp to replace Password value with ***.

cWExZjEiMTM= => ***

In my example I'm expecting the following output:

Data: {"Account":"d\\adm","Password":"***"},"SqlServer":{"InstanceName":"","MachineName":"MyMachine","Port":null

I only have the following solution:

string invokeSpec = "\":{\"Account\":\"d\\\\adm\",\"password\":\"cWExZjEiMTM=\"},\"SqlServer\":{\"InstanceName\":\"\",\"MachineName\":\"MyMachine\",\"Port\":null}";
var pattern = "\\\"Password\\\":\\\"(?<pass>[^\\\"]*)\\\"";
var replaced = Regex.Replace(invokeSpec, pattern, "\"Password\":\"***\"", RegexOptions.IgnoreCase); 

":{"Account":"d\\adm","Password":"***"},"SqlServer":{"InstanceName":"","MachineName":"MyMachine","Port":null}


Solution 1:[1]

As people said in the comment, if you can, use a JSON parser instead of regular expression. But let's dismiss that, since that's not the question.

You're capturing the wrong part of your input. What you want is a substitution.

string invokeSpec = "\":{\"Account\":\"d\\\\adm\",\"password\":\"cWExZjEiMTM=\"},\"SqlServer\":{\"InstanceName\":\"\",\"MachineName\":\"MyMachine\",\"Port\":null}";
var pattern = "(\\\"password\\\":\\\")[^\\\"]*(\\\")";
var replaced = Regex.Replace(invokeSpec, pattern, "$1***$2", RegexOptions.IgnoreCase);

As you can see, we're capturing two groups, the parts that the password is between of. So, there are 3 parts to the regular expression:

  • (\\\"password\\\":\\\") => Part to the left of the password
  • [^\\\"]* => the password itself (note that in your example, you can replace this with the non-greedy .*?)
  • (\\\") => Part to the right of the password

And we're referencing them with $1 and $2 in the replace method, replacing the original password with ***.

Solution 2:[2]

I suggest to use JObject to replace the Password

var jObject = JObject.Parse(jsonString);
jObject["Password"] = "*****";
Console.WriteLine(jObject.ToString()); //save this value to log

Solution 3:[3]

String pass = "abc=gwdgjs, vhhhhycPassword.10.22.33.09.0=hsdfjs,hjghygh=uhh";
        String passKeyStar = "";
        String passKeyStar1 = "";
        String keyValue[] = pass.split(",");
        for(String t : keyValue) {
        //passKeyStar = t;
        if(t.contains("Password")){
        passKeyStar1=t.split("=")[1];
        }
        }
        System.out.println("replace text: "+pass.replaceAll(passKeyStar1, "******"));

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Krishna Varma
Solution 3