我想在C#中创建一个正则表达式,以替换连接字符串的密码,从而在页面上显示时不会显示密码。连接字符串中的密码可能会以“PWD=password;”形式出现。
到目前为止,我的代码如下:
Regex.Replace(connStr, "PWD=.*;", "PWD=********");
这样可以找到模式的开头,但问题是通配符 (.*) 也包含了 ;,因此模式永远不会终止并且余下的字符串也被替换掉了。如何在正则表达式中表示除了 ; 之外的所有内容?
谢谢。
我想在C#中创建一个正则表达式,以替换连接字符串的密码,从而在页面上显示时不会显示密码。连接字符串中的密码可能会以“PWD=password;”形式出现。
到目前为止,我的代码如下:
Regex.Replace(connStr, "PWD=.*;", "PWD=********");
这样可以找到模式的开头,但问题是通配符 (.*) 也包含了 ;,因此模式永远不会终止并且余下的字符串也被替换掉了。如何在正则表达式中表示除了 ; 之外的所有内容?
谢谢。
string conString = "Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;";
var builder = new SqlConnectionStringBuilder(conString);
builder.Password = "********";
Console.WriteLine(builder.ToString());
您可以使用非贪婪量词:
PWD=.*?;
或者排除 ;
:
PWD=[^;]*;
RegexOptions.IgnoreCase
是不区分大小写的 :) - Ry-(?<=Password=).+?(?=(;|'|"|$))
使用正向后查找以查找密码的开头,使用正向前查找以查找密码的结尾,并使用非贪婪匹配表达式。在不同情况下,“检测令牌”(Password =;'“$)可能会有所不同。
C#实现
using System.Text.RegularExpressions;
private static Regex _regex = new Regex("(?<=Password=).+?(?=(;|'|\"|$))");
//...
var decryptPwdMatch = _regex.Match("some connectionstring for example");
//...
public static class StringExtensions
{
public static string MaskField(this string str, string field, string mask = "***")
{
var separators = ",;";
var sb = new StringBuilder();
foreach (var keyValue in Regex.Split(str, $"(?<=[{separators}])"))
{
var temp = keyValue;
var index = keyValue.IndexOf("=");
if (index > 0)
{
var key = keyValue.Substring(0, index);
if (string.Compare(key.Trim(), field.Trim(), true) == 0)
{
var end = separators.Contains(keyValue.Last()) ? keyValue.Last().ToString() : "";
temp = key + "=" + mask + end;
}
}
sb.Append(temp);
}
return sb.ToString();
}
}
"(?i)(?:^|.*;)pwd=(\".*\"|.*?)(?:;|$)+?"
或者
"(?i)(?:^|.*;)password=(\".*\"|.*?)(?:;|$)+?"
如果它里面有密码而不是pwd。
密码与以下代码匹配:
var regex = new Regex(mask);
var password = string.Empty;
var match = regex.Match(connectionString);
if (match.Success && match.Groups.Count > 1)
{
password = match.Groups[1].Value;
}
.*
将匹配尽可能多的字符。应该将其改为 .*?
才行。另外,(?:^|.*;)
也可以简写为 (?<=^|;)
—— 更有效率。 - Ry-