Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检测无效的XML字符_Java_Regex_Xml_Unicode - Fatal编程技术网

Java 检测无效的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\

关于这个问题:,在@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的回答中看到的那样:
  • 我不知道最后一个范围
    (U+10000–U+10FFFF)
    如何转换成
    “\ud800\udc00-\udbff\udfff”
    。难道不是
    “\u10000-\u10FFFF”
我真的必须检测或过滤这类字符,但我不完全确定如何做到这一点

顺便说一下,这必须在JDK1.5上运行(因此,不允许使用类似的表达式)

非常感谢

=======更新======

检测
字符串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。将问题中的模式复制粘贴到代码中。它可以工作,没有双反斜杠