我需要对转义的 XML 字符进行替换 >
<
和&
,但仅当它们包含在单引号内时。这很重要,因为正则表达式模式不应该能够找到 >
和<
当它们是开始和结束标签时。
示例,给定字符串 <Element><Element value="'hello&stack<overflow>'"/></Element>
我应该只得到>
<
和&
单引号 '
内。
这样我就可以用正确的 &
替换它们。 <
和>
(说来话长,这是发生的困惑的 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("&", "&").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:-]*
),或(|
)上一次成功匹配的结束(参见\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/