正则表达式解释

时间:2013-01-22 19:45:08

标签: .net regex

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

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

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

现在我的理解是Regex模式匹配所有无效的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]

所以我完全无法理解为什么匹配是由上述声明产生的。有人可以帮我解读它。

1 个答案:

答案 0 :(得分: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可能是匹配各种字符的模式。