【问题标题】:Regex Interpretation正则表达式解释
【发布时间】:2013-01-06 04:01:09
【问题描述】:

我试图从 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]

所以我完全不明白为什么上述语句会产生匹配。谁能帮我解读一下。

【问题讨论】:

  • Don't use regexes to parse XML。有几个解析器。
  • 您好,我完全理解。我不是在尝试解析 xml,而是清理我已经拥有的东西。所以让我们不要进入后台,专注于我错误地解释正则表达式模式的地方。
  • @m0skit0 这是个好建议,但 r_honey 提出的问题与解析 xml 无关。
  • r_honey 如果您在没有完整背景的情况下提出这个问题会更好。
  • 嗨@KevinBrydon,我想我已经把这个故事讲得够多了,但对于以后的问题肯定会采纳你的建议:)

标签: .net regex


【解决方案1】:

尝试使用\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 可能是匹配范围广泛的字符的模式。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多