簡體   English   中英

C# - 替換字符串中的字符

[英]C# - Replacing characters in a string

我有一個包含登錄名,數據庫和密碼的字符串。

string str = "user Id=abc, database=DDD, Password=mypasswd"  

我希望能夠用不同的值替換數據庫值“DDD”。

我嘗試使用string.Replace,但我不知道現有的數據庫是什么。

有誰知道一個簡單的解決方案?

以下是MSDN唯一推薦的防止連接字符串注入攻擊的方法

http://msdn.microsoft.com/en-us/library/ms254947.aspx

// cs stores previous connection string which came from config

System.Data.SqlClient.SqlConnectionStringBuilder builder = 
    new System.Data.SqlClient.SqlConnectionStringBuilder(cs);
builder.InitialCatalog = "NEWDB";

// you get your database name replaced properly...
cs = builder.ToString();

根據數據庫或數據庫驅動程序的類型,您必須使用不同的類,對於MySql,它應該是MySqlConnectionStringBuilder,屬性名稱可能是Database。

一種替代方法是使用正則表達式,這將替代你:

using System.Text.RegularExpressions;

string cStr = "user Id=abc, database=DDD, Password=mypasswd";
Console.WriteLine(cStr);

Regex r = new Regex("(?<=database=)(.+?)(?=,)");
cStr = r.Replace(cStr, "NewDatabaseName");

Console.WriteLine(cStr);

注意:這是使用scriptcs編譯,運行和驗證的,因此它可以放入您的解決方案中。

如何使用String.Format

string username = "abc";
string database = "myDB";
string password = "my_pw";

string str = String.Format("user Id={0}, database={1}, Password={2}",
                           username, database, password);

然后,您可以從配置文件加載這些值(甚至整個連接字符串)。

正則表達式也是一種選擇:

string str = "user Id=abc, database=DDD, Password=mypasswd",
    newDatabase = "newDb";

Console.WriteLine( Regex.Replace( str, @"(?<=database=)(.*?)(?=,)", m => newDatabase ) );

在逗號分隔符處拆分字符串,然后獲取結果數組的第二個索引,在相等的分隔符處拆分,替換第二個元素,然后重新組合所有

string str = "user Id=abc, database=DDD, Password=mypasswd";
string[] parts = str.Split(',');
string[] dbparts = parts[1].Split('=');
dbparts[1] = "new_database_name";

parts[1] = string.Join("=", dbparts);
string final = string.Join(", ", parts);

而且,通過一些錯誤檢查會更安全。

與上面相同,但如果你對LINQ很有趣

string str = "user Id=abc, database=DDD, Password=mypasswd";

var q = from part in str.Split(new[] {','})
                let trimedPart= part.Trim()
                let replacedPart  =trimedPart.StartsWith("database=")?trimedPart.Replace("DDD","newValue"):trimedPart
                select replacedPart;

        var newConStr = q.Aggregate((current, next) => current + "," + next);

這些解決方案都很棒,但是沒有一個長而混亂的線條有一定的優雅嗎?

"user Id=abc, database=DDD, Password=mypasswd".Substring(0, "user Id=abc, database=DDD, Password=mypasswd".IndexOf("database=")) + "database=" + "[YOUR VALUE HERE]" + ", " + "user Id=abc, database=DDD, Password=mypasswd".Substring("user Id=abc, database=DDD, Password=mypasswd".IndexOf("Password="))

輸出: user Id=abc, database=[YOUR VALUE HERE], Password=mypasswd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM