如何使用正则表达式替换匹配组的值

5
我希望修改连接字符串中“数据源”组件的值。我考虑以下解决方案:
使用这个正则表达式模式:
"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"。如何做到这一点?

4个回答

11

如果您坚持使用正则表达式进行替换,请注意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)创建的字符串即可。 - Mitulát báti

1

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


使用EntityFramework时,在app.config中有一个连接字符串。无论如何感谢您的帮助,但问题更多地涉及正则表达式的使用,而不是特定于连接字符串处理。 - Mitulát báti

0

只需要替换它。

string dbSource = "data source=myserver\\sqlexpress";

int sLen = dbSource.IndexOf("=") + 1;
string getString = dbSource.Substring(sLen, dbSource.Length - sLen);

dbSource = dbSource.Replace(getString, "whatyouwantotoreplaceitwith");

那样做行不通,因为连接字符串包含更多的等号。 - Mitulát báti
@Pistaatortenesz 这并不重要,indexOf 只会返回第一个 '=' 符号的位置。我的解决方案在这种情况下将始终百分之百地工作,无论字符串中有多少个等号符号。 - prospector
"metadata=","provider=","connection string=" 这些都在我的连接字符串中数据源之前。但我也想修改密码和用户 ID,所以顺序并不重要。 - Mitulát báti

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接