检测无效的XML字符

时间:2015-03-12 12:32:35

标签: java regex xml unicode

关于这个问题:removing invalid XML characters from a string in java,在@McDowell回复中,他/她说删除无效XML字符的方法是:

String xml10pattern = "[^"
                + "\u0009\r\n" // #x9 | #xA | #xD 
                + "\u0020-\uD7FF" // [#x20-#xD7FF]
                + "\uE000-\uFFFD" // [#xE000-#xFFFD] 
                + "\ud800\udc00-\udbff\udfff" // [#x10000-#x10FFFF]
                + "]";

然后:

replaceAll(xml10pattern, "");

嗯,我有两个问题:

  • 不应该转义所有unicode字符吗?我的意思是\\u0009\\u000A\\u000D...,而不是\u0009\r\n,就像我在@ ogrisel的回复中看到的那样:Stripping Invalid XML characters in Java
  • 我不明白最后一个范围(U+10000–U+10FFFF)如何转换为"\ud800\udc00-\udbff\udfff"。不能是"\u10000-\u10FFFF"吗?

我真的必须检测或过滤这种角色,我不完全确定如何做到这一点。

顺便说一下,这必须适用于JDK 1.5(因此,不允许使用像\x{h...h}这样的表达式)

非常感谢。

====== UPDATE ==

我想要检测String str是否包含此类无效字符的方式是:

if (!str.replaceAll(pattern, "").equals(str)) { 
    // Contains non XML valid characters. 
}

非常欢迎任何其他建议;)

1 个答案:

答案 0 :(得分:1)

1)它有两种工作方式,\u0009是java转义序列,\\u0009是正则表达式转义序列

2)Java String是UTF-16编码的,U + 10000是用2个16位字符\ud800\udc00编码的,参见Character API Unicode Character Representations