替换包含密码的字符串的一部分

时间:2016-06-09 11:46:55

标签: c# regex string replace

this question略有相似,我想替换argv内容:

string argv = "-help=none\n-URL=(default)\n-password=look\n-uname=Khanna\n-p=100";

到此:

"-help=none\n-URL=(default)\n-password=********\n-uname=Khanna\n-p=100"

我尝试了非常基本的字符串查找和搜索操作(使用IndexOfSubString等)。我正在寻找更优雅的解决方案,以便替换这部分字符串:

-password=AnyPassword

为:

-password=*******

保持字符串的其他部分完好无损。我希望String.ReplaceRegex替换可能有所帮助。

我尝试了什么(没有太多的错误检查):

var pwd_index = argv.IndexOf("--password=");

string converted;

if (pwd_index >= 0)
{
     var leftPart = argv.Substring(0, pwd_index);
     var pwdStr = argv.Substring(pwd_index);
     var rightPart = pwdStr.Substring(pwdStr.IndexOf("\n") + 1);

     converted = leftPart + "--password=********\n" + rightPart;
}
else
     converted = argv;

Console.WriteLine(converted);

2 个答案:

答案 0 :(得分:3)

此代码用几个"*"个字符替换密码值:

string argv = "-help=none\n-URL=(default)\n-password=look\n-uname=Khanna\n-p=100";
string result = Regex.Replace(argv, @"(password=)([\s\S]*?\n)",
    match => match.Groups[1].Value + new String('*', match.Groups[2].Value.Length - 1) + "\n");

您也可以删除new String()部分并将其替换为字符串常量

答案 1 :(得分:3)

解决方案

Rubens Farias' solution类似,但更优雅:

string argv = "-help=none\n-URL=(default)\n-password=\n-uname=Khanna\n-p=100";
string result = Regex.Replace(argv, @"(password=)[^\n]*", "$1********");

它按字面意思匹配password=,将其存储在捕获组$1中并保持匹配,直到达到\n

但这会产生一定数量的*。{s}。但无论如何,告诉密码有多少字符,可能已经向黑客传达了太多信息。

工作示例:https://dotnetfiddle.net/xOFCyG

正则表达式细分

(              // Store the following match in capture group $1.
  password=    // Match "password=" literally.
)    
[              // Match one from a set of characters.
  ^            // Negate a set of characters (i.e., match anything not
               //   contained in the following set).
    \n         // The character set: consists only of the new line character.
]
*              // Match the previously matched character 0 to n times.