正则表达式 (C#):匹配 > < &(非法 XML 字符)但仅当包含在引号内时

Regex (C#): match > < & (illegal XML chars) but only when contained within qutoes

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

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

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

我知道我可以使用 '(.*)' 来获取单引号之间的所有字符,但现在我怎样才能只提取其中的转义字符。

它适用于这种情况。如果您可以包含更多输入,我们也可以改进并覆盖它们。

检查这个:

(?<!^)(>|<|&)(?=.*')

演示:

https://regex101.com/r/EgXlcD/2

您可以将标签名称与所有后续属性 names/values 匹配,并且仅替换值内的 <>(或名称,取决于您的数据有多混乱).

这可以在 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+ 个字符,然后是 "