Regex Interpretation
我试图从xml中过滤掉无效字符。尽管我已经成功完成了该工作,但是我在此过程中编写了一个正则表达式,这对我来说是违反直觉的。
请考虑以下.Net正则表达式评估:
1 | 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
这些是有效字符:
1 | #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] |
据我所知,上述正则表达式模式是剩余的Unicode字符(即无效的xml字符)的集合差异。但是仍然运行上面的语句会产生以下结果:
"测试"
(即整个输入字符串)。我不明白为什么。特别是,正则表达式的这一部分会导致匹配:
\\\\\\\\ xD800-\\\\\\\\ xDFFF
在我看来,这两个组从有效字符中排除了相同的内容:
[#x20-#xD7FF] | [#xE000-#xFFFD]
因此,我完全不理解上面的陈述为什么会产生匹配。有人可以帮我解密吗。
尝试使用
1 | System.Text.RegularExpressions.Regex.Match("Test", @"[\\x01-\\x08\\x0B-\\x0C\\x0E-\\x1F\\uD800-\\uDFFF\\uFFFE-\\uFFFF]+").ToString(); |
据我了解,您当前的正则表达式与字符串" Test"匹配,因为它在以下范围内基本匹配
1 2 3 4 5 6 7 8 9 10 11 | \\x01-\\x08 \\x0B-\\x0C \\x0E-\\x1F \\xD8 0 0-\\xDF F F \\xFF FE-\\xFF FF |
匹配