【问题标题】:How to replace a matched group value with Regex如何用正则表达式替换匹配的组值
【发布时间】:2014-11-18 00:17:27
【问题描述】:

我想修改连接字符串中“数据源”组件的值。我正在考虑以下解决方案:

使用这个正则表达式模式:

"data source\=((\w|\-)+?\\{1}\w+?)\;"

我可以获得以下字符串匹配:

Match.Groups[0].Value = "data source=MY-PC\SQLEXPRESS;"
Match.Groups[1].Value = "MY-PC\SQLEXPRES"

所以首先我想在连接字符串中找到与“data source=something;”匹配的部分,然后只替换连接字符串中的“something”。该怎么做?

【问题讨论】:

    标签: c# .net regex connection-string


    【解决方案1】:

    如果你坚持正则表达式替换,请注意C#不能修改已构建的字符串,你需要得到一个替换所需部分的新字符串。

    var connectionString = @"data source=MY-PC\SQLEXPRESS;";
    var pattern = @"(data source=)((\w|\-)+?\\\w+?)\;";
    var newConnectionString = Regex.Replace(connectionString, pattern, "$1" + "something");
    Console.WriteLine(newConnectionString);
    

    【讨论】:

    • 这是我一直在寻找的解决方案,同时我自己也想通了。使用 Regex.Replace,我只是将匹配的部分替换为我之前使用 String.Format("data source={0};", newSql); 创建的字符串
    【解决方案2】:

    对于 .NET 中的大多数连接字符串类型,应该有一个对应的 ConnectionStringBuilder 类来处理这类事情。你是如何连接到你的数据库的?

    【讨论】:

    • 使用 EntityFramework。 app.config 中有一个连接字符串。无论如何,谢谢,但问题更多在于正则表达式的使用,而不是专门针对连接字符串处理。
    【解决方案3】:

    只需替换它。

    string dbSource = "data source=myserver\\sqlexpress";
    
    int sLen = dbSource.IndexOf("=") + 1;
    string getString = dbSource.Substring(sLen, dbSource.Length - sLen);
    
    dbSource = dbSource.Replace(getString, "whatyouwantotoreplaceitwith");
    

    【讨论】:

    • 这不会成功,因为连接字符串包含更多等号。
    • @Pistaatortenesz 没关系, indexOf 只会返回第一个 '=' 符号的位置。在这种情况下,我的解决方案将在 100% 的时间内有效,无论字符串中有多少等号。
    • "metadata=", "provider=", "connection string=",所有这些都在我的连接字符串中的数据源之前。但我也想修改密码和用户 ID...所以订单无论如何都不算​​数。
    【解决方案4】:

    您可以使用带有 '=' 字符的简单 string.split 进一步拆分匹配项,或者如果您喜欢正则表达式,请参阅 MSDN Regex.Replace 方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2016-10-20
      • 2012-09-19
      • 2012-11-23
      • 2022-08-10
      • 1970-01-01
      • 2015-11-30
      相关资源
      最近更新 更多