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

Posted

技术标签:

【中文标题】正则表达式 (C#):匹配 > < 或(非法 XML 字符)但仅当包含在引号内时【英文标题】:Regex (C#): match > < & (illegal XML chars) but only when contained within qutoes 【发布时间】:2017-06-25 12:55:23 【问题描述】:

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

例如,给定字符串&lt;Element&gt;&lt;Element value="'hello&amp;stack&lt;overflow&gt;'"/&gt;&lt;/Element&gt;

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

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

【问题讨论】:

【参考方案1】:

您可以将标签名称与所有后续属性名称/值匹配,并且仅替换值内的 &lt;&gt;(或名称,取决于您的数据的混乱程度)。

这可以在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("01", 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。详情:

((?:&lt;[a-zA-Z][\w:-]*|\G(?!\A))\s+[^\s=&lt;]*=) - 第 1 组: (?:&lt;[a-zA-Z][\w:-]*|\G(?!\A)) - &lt;、ASCII 字母、0+ 字字符、:-(参见 &lt;[a-zA-Z][\w:-]*)或 (|) 上一个成功匹配的结尾(参见 @987654335 @) \s+ - 1+ 个空格 [^\s=&lt;]*= - 除了空格之外的 0+ 个字符,=&lt; ("[^"]*") - 第 2 组: "[^"]*" - 一个",除" 之外的0+ 个字符,然后是"

【讨论】:

也检查一下这个:***.com/questions/42065310/… 太棒了。这是我永远无法弄清楚的事情。谢谢!【参考方案2】:

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

检查一下:

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

演示:

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

【讨论】:

糟糕,我说得太早了,我用一个不起作用的案例编辑了这个例子。 @MH175 使用正则表达式可能有点困难。使用 xml 解析器可以很容易地完成。我没有接触过 C#,或者会为你做。检查这个:***.com/questions/642293/… 不幸的是,这就是问题所在。在我更正这些错误之前,解析器(XDocument)甚至不会运行,并抛出异常,因为它遇到了所有这些非法字符。 link 编辑:除非你是Wiktor Stribiżew,否则使用正则表达式可能会很困难

以上是关于正则表达式 (C#):匹配 > < 或(非法 XML 字符)但仅当包含在引号内时的主要内容,如果未能解决你的问题,请参考以下文章

c# 正则表达式 匹配中括号&颜色过滤

C#正则表达式

2016.7.27 VS搜索正则表达式,在UltraEdit中可选用Perl正则引擎,按C#语法搜索

求一条c# 正则表达式,来获取HTML标签的内容

正则表达式匹配 C# 中的 Json 数组元素

c# 正则表达式 匹配