我应该只得到 > 在值中(或名称,取决于您的数据有多困惑)。 这可以在 Regex.Replace 内完成匹配评估器: var s = "'\"-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:43:01 25 4
gpt4 key购买 nike

我需要对转义的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com