Java Don';无法理解有效XML字符集的正则表达式
正如w3c所描述的,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 =
/*
* 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开头的代码点使用两个char
s进行编码:一个高代理,后跟一个低代理。字符串和正则表达式在char
s上工作,而不是在代码点上工作,因此您必须自己翻译它们。第一个表达式的可能重复肯定是错误的。在最后一个六进制上没有反斜杠是没有意义的。顺便说一下:你很幸运,你得到了一个例外。这只是因为'\x10'
小于'0'
。您的模式可编译为以下字符:除\x09
、\x0A
、\x0D
、范围\x20-\xD7
、E
、F
、\xE0
、范围0-\xFF
、范围F
中的某些字符,等等。此字符类包含许多重复字符,唯一的错误是末尾的字符范围0-\x10
。