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=""([^""]*)""";