C#正则表达式获取两个标签之间的文本?

时间:2020-03-23 21:02:01

标签: c# regex

好的,我在替换此配置文件中的文本时遇到了一些困难。我要替换的部分...

    <!-- Executables we want to manage -->
  <KioskExecutables>
    <Executables>
      <add appName="Valet" exeName="365Valet.exe" startOrder="0" />
      <add appName="Sync" exeName="365Sync.exe" startOrder="1" />
      <add appName="Readiness" exeName="KioskReadiness.exe" startOrder="2" />
</Executables>
  </KioskExecutables>

我想在标签之间交换文本。我写了以下内容。

string matchCodeTag = @"<Executables>(.*?)</Executables>";
string textToReplace = File.ReadAllText(@"C:\Temp\Controller.exe.config");
string replaceWith = "<add appName=\"Disable\" exeName=\"C:\\Temp\\Disable.exe\" startOrder=\"0\" />";
string output = Regex.Replace(textToReplace, matchCodeTag, replaceWith);

我相信这似乎并没有引起人们的注意,因为换行符,但我不确定。

有人可以把我推向正确的方向吗?

1 个答案:

答案 0 :(得分:0)

如前所述,您应该使用XmlDocument来解析您的配置。

但是,如果必须使用正则表达式,则需要启用“单行”选项,以便点字符(。)也与换行符匹配,例如

string matchCodeTag = @"<Executables>(.*)</Executables>";
string textToReplace = File.ReadAllText(@"C:\Temp\Controller.exe.config");
string replaceWith = "<add appName=\"Disable\" exeName=\"C:\\Temp\\Disable.exe\" startOrder=\"0\" />";
string output = Regex.Replace(textToReplace, matchCodeTag, 
                              replaceWith, RegexOptions.Singleline);

或者您可以像这样在正则表达式模式中设置选项

string matchCodeTag = @"(?s)<Executables>(.*)</Executables>";

您的模式不需要问号,因为*已经是“零个或多个匹配项”