正则表达式 (C#):匹配 > < &(非法 XML 字符)但仅当包含在引号内时
Regex (C#): match > < & (illegal XML chars) but only when contained within qutoes
我需要对转义的 XML 字符 >
<
和 &
进行替换,但前提是它们包含在单引号内。这很重要,因为当 >
和 <
是开始和结束标记时,正则表达式模式不应该能够找到它们。
示例,给定字符串 <Element><Element value="'hello&stack<overflow>'"/></Element>
我应该只得到单引号 '
内的 >
<
和 &
。
这样我就可以用适当的 &
<
和 >
替换它们(长话短说,这是发生的混乱 XML 解析的结果)。
我知道我可以使用 '(.*)'
来获取单引号之间的所有字符,但现在我怎样才能只提取其中的转义字符。
它适用于这种情况。如果您可以包含更多输入,我们也可以改进并覆盖它们。
检查这个:
(?<!^)(>|<|&)(?=.*')
演示:
您可以将标签名称与所有后续属性 names/values 匹配,并且仅替换值内的 <
和 >
(或名称,取决于您的数据有多混乱).
这可以在 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>
这里是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+ 个字符,然后是 "
我需要对转义的 XML 字符 >
<
和 &
进行替换,但前提是它们包含在单引号内。这很重要,因为当 >
和 <
是开始和结束标记时,正则表达式模式不应该能够找到它们。
示例,给定字符串 <Element><Element value="'hello&stack<overflow>'"/></Element>
我应该只得到单引号 '
内的 >
<
和 &
。
这样我就可以用适当的 &
<
和 >
替换它们(长话短说,这是发生的混乱 XML 解析的结果)。
我知道我可以使用 '(.*)'
来获取单引号之间的所有字符,但现在我怎样才能只提取其中的转义字符。
它适用于这种情况。如果您可以包含更多输入,我们也可以改进并覆盖它们。
检查这个:
(?<!^)(>|<|&)(?=.*')
演示:
您可以将标签名称与所有后续属性 names/values 匹配,并且仅替换值内的 <
和 >
(或名称,取决于您的数据有多混乱).
这可以在 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>
这里是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+ 个字符,然后是"