c# - 正则表达式 (C#) : match > < & (illegal XML chars) but only when contained within qutoes

标签 c# regex quotes

我需要对转义的 XML 字符进行替换 > <& ,但仅当它们包含在单引号内时。这很重要,因为正则表达式模式不应该能够找到 ><当它们是开始和结束标签时。

示例,给定字符串 <Element><Element value="'hello&stack<overflow>'"/></Element>

我应该只得到> <&单引号 ' 内。 这样我就可以用正确的 &amp; 替换它们。 &lt;&gt; (说来话长,这是发生的困惑的 XML 解析的结果)。

我知道我可以使用'(.*)'获取单引号之间的所有字符,但现在如何仅提取其中的转义字符。

最佳答案

您可以将标签名称与所有后续属性名称/值相匹配,并且仅替换 <>在值(或名称,取决于数据的困惑程度)内。

这可以在 Regex.Replace 内完成匹配评估器:

var s = "<Element><Element value=\"'hello&stack<overflow>'\" value=\"'hi&stack<over flow2 >'\"/></Element>";
var rx = @"((?:<[a-zA-Z][\w:-]*|\G(?!\A))\s+[^\s=<]*=)(""[^""]*"")";
var clean = Regex.Replace(s, rx, m => 
    string.Format("{0}{1}", m.Groups[1].Value, m.Groups[2].Value.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;"))
);
 // => <Element><Element value="'hello&amp;stack&lt;overflow&gt;'" value="'hi&amp;stack&lt;over flow2 &gt;'"/></Element>

请参阅C# demo

这是regex demo 。详情:

  • ((?:<[a-zA-Z][\w:-]*|\G(?!\A))\s+[^\s=<]*=) - 第 1 组:
    • (?:<[a-zA-Z][\w:-]*|\G(?!\A)) - 要么 < ,一个 ASCII 字母,0+ 个单词字符,: ,或- (参见 <[a-zA-Z][\w:-]* ),或( | )上一次成功匹配的结束(参见 \G(?!\A) )
    • \s+ - 1 个以上空格
    • [^\s=<]*= - 0+ 个除空格之外的字符,=<
  • ("[^"]*") - 第 2 组:
    • "[^"]*" - 一个" , 除 " 之外的 0+ 个字符然后是 "

关于c# - 正则表达式 (C#) : match > < & (illegal XML chars) but only when contained within qutoes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42104101/

相关文章:

c# - 如何在 WPF 桌面应用程序中使用 WinRT MediaCapture 录制时使用 CapturedFrame 呈现网络摄像头视频预览

c# - ObserveOn 与修改代码以在主线程上运行

c# - 用于 Java 或 C# 或 vb.net 的 Sip/VoIP 库

mysql - 将 MySQL "INSERT"命令转换为文本

regex - 处理大量用户定义的正则表达式的最佳方法是什么

Python:尝试通过在名片上移动外部边框来获取用户输入

c# - 遍历双引号但忽略单引号中的双引号

c# - 是否有一个很好的资源可以概述 linq 优化?

JavaScript 正则表达式 "Single Space Character"

从 R 中的字符向量中删除引号