Java 检测无效的XML字符
关于这个问题:,在@McDowell回复中,他/她说删除无效XML字符的方法是:Java 检测无效的XML字符,java,regex,xml,unicode,Java,Regex,Xml,Unicode,关于这个问题:,在@McDowell回复中,他/她说删除无效XML字符的方法是: String xml10pattern = "[^" + "\u0009\r\n" // #x9 | #xA | #xD + "\u0020-\uD7FF" // [#x20-#xD7FF] + "\uE000-\uFFFD" // [#xE000-#xFFFD] + "\ud800\
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…
,就像我在@ogrisel的回答中看到的那样:\u0009\r\n
- 我不知道最后一个范围
如何转换成(U+10000–U+10FFFF)
。难道不是“\ud800\udc00-\udbff\udfff”
李>“\u10000-\u10FFFF”
字符串str
是否包含此类无效字符的方法是:
if (!str.replaceAll(pattern, "").equals(str)) {
// Contains non XML valid characters.
}
任何其他建议都将非常受欢迎;) 1)它是双向的,\u0009
是java转义序列,\\u0009
是正则转义序列
2) Java字符串是UTF-16编码的,U+10000用2个16位字符编码
\ud800\udc00
,参见字符API Unicode字符表示法至于第二个问题,答案是否定的;Java字符是UTF-16代码单元,因此您需要在这里匹配代理项对。但是请注意,由于Java 1.7,您也可以编写\x10000-\x10FFFF
。@fge,这是如何做到的?我不明白U+10000
是如何转换成\ud800\udc00
这里我能给你的最好答案是:)它解释了前导和尾随代理是如何生成的。很好!我一直在寻找,但我没有注意到UTF-16
。我在JAVA 6环境中(IBM J9 VM(build 2.6,JRE 1.6.0 Linux x86-32
),在索引56附近得到了一个错误非法字符范围表达式:[^\u0009\r\n\u0020-\uD7FF\uE000-\uFFFD\ud800\udc00-\udbff\udfff]
.56指向udfff
.1)前面的反斜杠,我会在replaceAll
中使用哪个反斜杠。两种方法都有效吗?我想检测它的用法的方式是:str.replaceAll(pattern,”).equals(str)
String str2=str.replaceAll(pattern,”)-您将获得删除了非xml字符的str2。将问题中的模式复制粘贴到代码中。它可以工作,没有双反斜杠