Java Don';无法理解有效XML字符集的正则表达式

Java Don';无法理解有效XML字符集的正则表达式,java,xml,regex,encoding,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 =

正如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]

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

第一个表达式的可能重复肯定是错误的。在最后一个六进制上没有反斜杠是没有意义的。顺便说一下:你很幸运,你得到了一个例外。这只是因为
'\x10'
小于
'0'
。您的模式可编译为以下字符:除
\x09
\x0A
\x0D
、范围
\x20-\xD7
E
F
\xE0
、范围
0-\xFF
、范围
F
中的某些字符,等等。此字符类包含许多重复字符,唯一的错误是末尾的字符范围
0-\x10