1

我试图从 xml 中过滤掉无效字符。虽然我已经成功地做到了,但我在这个过程中写了一个正则表达式,这对我来说是违反直觉的。

请考虑以下 .Net 正则表达式评估:

System.Text.RegularExpressions.Regex.Match("Test", @"[\x01-\x08\x0B-\x0C\x0E-\x1F\xD800-\xDFFF\xFFFE-\xFFFF]+").ToString()

现在我的理解是正则表达式模式匹配所有无效的 xml 字符。根据此页面: http ://www.w3.org/TR/REC-xml/#NT-Char

这些是有效字符:

#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

据我了解,上面的正则表达式模式是剩余 Unicode 字符(即无效的 xml 字符)的一组差异。然而,仍然运行上面的语句会产生这个结果:

“测试”

(即整个输入字符串)。我无法理解为什么。特别是,这部分正则表达式导致匹配:\xD800-\xDFFF

在我看来,这两组从有效字符中排除了相同的内容:[#x20-#xD7FF] | [#xE000-#xFFFD]

所以我完全不明白为什么上述语句会产生匹配。有人可以帮我破译它。

4

1 回答 1

3

尝试使用\u而不是\x.

System.Text.RegularExpressions.Regex.Match("Test", @"[\x01-\x08\x0B-\x0C\x0E-\x1F\uD800-\uDFFF\uFFFE-\uFFFF]+").ToString();

我理解它的方式是您当前的正则表达式匹配字符串“Test”,因为它基本上匹配以下范围

\x01-\x08
\x0B-\x0C
\x0E-\x1F
\xD8
0
0-\xDF
F
F
\xFF
FE-\xFF
FF

匹配0-\xDF很可能是匹配范围广泛的字符的模式。

于 2013-01-22T20:05:45.210 回答