2011-12-02 6 views
9

C# düzenli ifade ile bağlantı dizesi şifreyi değiştirin. Bağlantı dizesi parolası dizede PWD = parola olarak bir yerdedir;Ben sayfada göstermek zaman gösterilmeyen şekilde bir bağlantı dizesi şifresini değiştirir C# düzenli ifade oluşturmak çalışıyorum

Şimdiye kadar var:

Regex.Replace(connStr, "PWD=.*;", "PWD=********"); 

Bu desen başlangıcını bulmak için çalışır, ancak sorun joker da dahil olduğu; (*.) böylece desen hiçbir zaman sonlandırılmaz ve dizenin geri kalan kısmı da değiştirilir. Herşeyi nasıl söyleyebilirim ama a; RegEx'imde

Teşekkürler.

olmayan bir açgözlü niceleyici kullanabilirsiniz
+4

Sadece merak - Sana iyi bir neden eminim - ama neden * hiç * gösterisi bile Web sayfanızda kısmi bağlantı dizesi? – David

+0

Bir yönetici web sunucusu için. Yöneticiler uygulama dizeleri aracılığıyla bağlantı dizelerini değiştirebilir, ancak liste sayfasındaki şifreleri görmelerini istemiyorum. – Paul

cevap

15

:

PWD=.*?; 

Ya ; s dışlamak:

PWD=[^;]*; 
+0

Eksik olduğum şey bu. Teşekkürler! durumunda – Paul

+6

bu son öğe olduğunu ve muhtemelen kullanması gereken bir noktalı virgül izledi değil: PWD = ([^;] *) (: $ |;?) – Dracorat

+0

Bu güzel bir nokta var. Ayrıca, PWD = değerini (PWD = | pwd =) değiştirdim. – Paul

0

Bu sorunun geldi ve meslektaşı aşağıdaki regex ile geldi:

"(?i)(?:^|.*;)pwd=(\".*\"|.*?)(?:;|$)+?" 

veya

"(?i)(?:^|.*;)password=(\".*\"|.*?)(?:;|$)+?" 

bunun yerine pwd şifre varsa.

Şifre aşağıdaki kodla maçları:

  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; 
      } 
+0

Dikkatli olduğunuzdan emin olun; şifre tırnak içinde ise ve başka bir şey de tekliflerde ise, '. *' mümkün olduğunca çok eşleşecektir. Muhtemelen '' * '' olmalıdır. Ayrıca, '(?:.^| *;)' Sadece 'olabilir (? <=^|;)' - muhtemelen daha etkili. – Ryan

9

Bunun için RegEx kullanmak gerekmez - .NET sahiptir yerleşik bağlantı dizesi değerleri almak için kullanabilirsiniz SqlConnectionStringBuilder sınıfında ve onları değiştirin.

örnek kod: önerilen çözüm ile sorunların

string conString = "Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;"; 
var builder = new SqlConnectionStringBuilder(conString); 

builder.Password = "********"; 

Console.WriteLine(builder.ToString()); 
+0

Bu, OracleClient bağlantı dizeleri için de çalışır mı? – Paul

+0

Oracle'ı bilmiyorum, bu yüzden emin olamıyorum. Ama ben sadece biraz googled ve [OracleConnectionStringBuilder] (http://msdn.microsoft.aradığınız gibi görünen com/en-us/library/system.data.oracleclient.oracleconnectionstringbuilder.aspx). Gelecekte kullanımdan kaldırılacak ve kaldırılacak ... [Microsoft gelecekte bir 3. taraf sağlayıcısını kullanmayı önerdi] (http://msdn.microsoft.com/en-us/library/77d8yct7.aspx). –

+0

Teşekkürler. Bu projeyi (bir süredir) hatırlatırsam bağlantı dizgisi sadece MSSQL değil, herhangi bir DMBS için olabilirdi. Ama bahşiş için teşekkürler. Bilmek güzel. – Paul

0

sürü. Bu Regex saf değildir, ancak kılıfı, beyaz boşluk ve opsiyonel sondaki ayırıcılar (ya;) kolları

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(); 
    } 
}