我需要对转义的XML字符>
<
和&
进行替换,但前提是它们包含在单引号中。这很重要,因为当正则表达式模式是开始和结束标记时,它们应该无法找到>
和<
。
示例,给定字符串<Element><Element value="'hello&stack<overflow>'"/></Element>
我应该只获得单引号>
中的<
&
和'
。
这样我就可以使用正确的&
<
和>
替换它们(很长一段时间,这是因为发生了混乱的XML解析的结果)。
我知道我可以使用'(.*)'
来获取单引号之间的所有字符,但现在我怎样才能只提取其中的转义字符。
答案 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("&", "&").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:-]*
),或({{ 1}})上一次成功匹配的结束(请参阅|
)\G(?!\A)
- 1+空格\s+
- 0空格以外的字符[^\s=<]*=
和=
<
- 第2组:
("[^"]*")
- 除"[^"]*"
以外的"
,0 +个字符,然后是"
答案 1 :(得分:1)