正则表达式 (C#):匹配 > < 或(非法 XML 字符)但仅当包含在引号内时
Posted
技术标签:
【中文标题】正则表达式 (C#):匹配 > < 或(非法 XML 字符)但仅当包含在引号内时【英文标题】:Regex (C#): match > < & (illegal XML chars) but only when contained within qutoes 【发布时间】:2017-06-25 12:55:23 【问题描述】:我需要对转义的 XML 字符 &gt;
&lt;
和 &amp;
进行替换,但前提是它们包含在单引号中。这很重要,因为当 &gt;
和&lt;
是开始和结束标记时,正则表达式模式不应该能够找到它们。
例如,给定字符串<Element><Element value="'hello&stack<overflow>'"/></Element>
我应该只得到单引号 '
内的 &gt;
&lt;
和 &amp;
。
这样我就可以用正确的 &amp;
&lt;
和 &gt;
替换它们(长话短说,这是发生混乱的 XML 解析的结果)。
我知道我可以使用 '(.*)'
来获取单引号之间的所有字符,但现在我如何才能只提取其中的转义字符。
【问题讨论】:
【参考方案1】:您可以将标签名称与所有后续属性名称/值匹配,并且仅替换值内的 <
和 >
(或名称,取决于您的数据的混乱程度)。
这可以在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("&", "&").Replace("<", "<").Replace(">", ">"))
);
// => <Element><Element value="'hello&stack<overflow>'" value="'hi&stack<over flow2 >'"/></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:-]*
)或 (|
) 上一个成功匹配的结尾(参见 @987654335 @)
\s+
- 1+ 个空格
[^\s=<]*=
- 除了空格之外的 0+ 个字符,=
和 <
("[^"]*")
- 第 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 字符)但仅当包含在引号内时的主要内容,如果未能解决你的问题,请参考以下文章