不了解有效XML字符集的正则表达式

时间:2011-04-18 06:16:59

标签: java xml regex encoding

正如w3c所描述的那样,XML的有效字符是有限的。

我们可以通过遵循正则表达式来识别无效的字符:

/*
 * From xml spec valid chars:
 * #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
 * any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
 */
    Pattern pattern = Pattern.compile("[^\\x09\\x0A\\x0D\\x20-\\xD7EF\\xE000-\\xFFFD\\x10000-x10FFFF]");

但我不知道为什么表达不是:

 Pattern pattern = Pattern.compile("[^\\x09\\x0A\\x0D\\x20-\\xD7EF\\xE000-\\xFFFD\\x10000-\\x10FFFF]");

错误消息是:

java.util.regex.PatternSyntaxException: Illegal character range near index 49
[^\x09\x0A\x0D\x20-\xD7EF\xE000-\xFFFD\x10000-\x10FFFF]

1 个答案:

答案 0 :(得分:2)

简单回答:并非每个 Unicode代码点都可以在Java中表示为char。这是因为代码点由21位数字标识,但char仅为16位宽。因此,以U + 10000开头的代码点使用两个char进行编码:a 高代理,然后是低代理。字符串和正则表达式适用于char s,而不是代码点,因此您必须自己翻译它们。