正则表达式(C#):匹配> < &安培; (非法的XML字符),但只有当包含在qutoes

时间:2017-02-08 03:23:26

标签: c# regex quotes

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

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

我应该只获得单引号>中的< &'。 这样我就可以使用正确的&amp; &lt;&gt;替换它们(很长一段时间,这是因为发生了混乱的XML解析的结果)。

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

2 个答案:

答案 0 :(得分:2)

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

这可以在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:-]*),或({{ 1}})上一次成功匹配的结束(请参阅|
    • \G(?!\A) - 1+空格
    • \s+ - 0空格以外的字符[^\s=<]*==
  • < - 第2组:
    • ("[^"]*") - 除"[^"]*"以外的",0 +个字符,然后是"

答案 1 :(得分:1)

适用于此案例。如果您可以包含更多输入,我们也可以改进并覆盖它们。

检查一下:

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

演示:

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