2017-05-25 64 views
0

[^ \ u0009 \ u000A \ u000D \ u0020- \ uD7FF \ uE000- \ uFFFD \ uD800 \ uDC00- \ uDBFF \ uDFFF]java.util.regex.PatternSyntaxException:邻近索引非法字符范围71

的上面一行显示非法字符范围异常。谁能帮帮我吗。

如果我直接在java代码中使用上面的行,它不会显示任何错误。

Pattern xmlInvalidChars = Pattern.compile("[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\uD800\uDC00-\uDBFF\uDFFF]"); 

但是,如果从配置xml文件中获取字符串并在java代码中使用,则显示错误。

String chars = ConfigLoader.getInstance().getInvalidCharacters(); 
Pattern xmlInvalidChars = Pattern.compile(chars); 
+1

问题出在'\ uDC00- \ uDBFF'上,这个范围是乱序的。你需要什么来匹配模式?也许你需要删除连字符来删除错误的范围?另外,您需要在XML中使用单个反斜杠。 –

+0

As @WiktorStribiżew表示,请参阅https://en.wikipedia.org/wiki/UTF-8#Invalid_code_points – Simon

回答

0

我在配置xml文件中使用了下面的行。

[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\uD800\\uDC00-\\uDBFF\uDFFF] 

这是我使用了相反的情况。我改变了单斜杠双斜线(\到\)和双斜杠单斜杠(\到)。它正在工作。

1

我还不能评论,所以我会作为答复发布。在你的字符串里面你有反斜杠\uD800\uDC00-\uDBFF\uDFFF,因此,它将\u当作逃生字符,但它不是。只需添加双反斜杠作为你的正则表达式的其余部分。


编辑:编译模式之前,请尝试使用双斜杠来代替单一的斜线。

chars = chars.replace("\\","\\\\"); 
+0

它不工作......其实我正在使用此模式来包装传入xml中存在的无效字符与CDATA文件。但这种解决方案不工作... – Gopinath

+0

嗯,也许这是因为它正在从文件中加载文字字符串? 你可以尝试在你的xml文件中替换双斜杠的单斜线。或者尝试在java中替换它。相应地编辑我的答案。 –

相关问题