C# Regex替换不更改
很抱歉,没有想出一个更好的标题。也许有人能帮我弄清楚为什么我的正则表达式替换当前不起作用。所以我有以下功能:C# Regex替换不更改,c#,regex,C#,Regex,很抱歉,没有想出一个更好的标题。也许有人能帮我弄清楚为什么我的正则表达式替换当前不起作用。所以我有以下功能: string installlocation = session.CustomActionData["location"]; string regex = "add key=\x22Directory\x22 value=\x22([^\x22]*)\x22"; string replacement = "add key='Directory' value='" + installloc
string installlocation = session.CustomActionData["location"];
string regex = "add key=\x22Directory\x22 value=\x22([^\x22]*)\x22";
string replacement = "add key='Directory' value='" + installlocation + "'";
string input = File.ReadAllText(@Path.Combine(installlocation,"DeliveryService.exe.config"));
Regex rgx = new Regex(regex);
string result = rgx.Replace(input, replacement);
File.WriteAllText(@Path.Combine(installlocation, "DeliveryService.exe.config"), result);
其中installlocation=C:\ProgramFiles(x86)\Wizard
运行时没有错误,当假定的结果写回文件时,文件包含相同的信息。什么都没有改变。下面是正在搜索和替换的文件,以供参考:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="Directory" value="" />
<add key="Timer" value="5" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>
关于regex替换的文章 使用逐字字符串文字将完成以下工作:
string regex = @"add key=\x22Directory\x22 value=\x22([^\x22]*)\x22";
这里的要点是,您可以使用“”
或十六进制模式\x22
作为逐字字符串文本中的双引号
此示例代码也在运行:
string regex = @"add key=\x22Directory\x22 value=\x22([^\x22]*)\x22";
string input = "<add key=\"Directory\" value=\"\" />";
Regex rgx = new Regex(regex);
string replacement = "<REPLACEMENT>";
string result = rgx.Replace(input, replacement);
string regex=@“add key=\x22 directory\x22 value=\x22([^\x22]*)\x22”;
字符串输入=”;
正则表达式rgx=新正则表达式(正则表达式);
字符串替换=”;
字符串结果=rgx.Replace(输入,替换);
您不需要使用\x22
当您的模式包含转义序列时,请将其括在@“…”
中或使用双反斜杠
所以你可以这样写:
string regex = @"add key=""Directory"" value=""([^""]*)""";
(双引号由另一个双引号转义)
另一方面,regex替换(作为简单的文本替换)不是更改xml文件中属性值的方法。使用XML解析器。这很有效!有趣的是,逐字记录字符串不起作用,但它起作用了。我想这是.net正则表达式相对于其他正则表达式的一个警告。@Kyle:这也是一个逐字的字符串文字。实际上,您的正则表达式从一开始就很好,不需要用双引号替换十六进制代码。要点是使用带有正则表达式符号的逐字字符串文字(在正则表达式元字符周围使用单转义符)。您也可以使用string regex=“add key=\\x22Directory\\x22 value=\\x22([^\\x22]*)\\x22”
,这样就可以了。
string regex = @"add key=""Directory"" value=""([^""]*)""";