java.util.regex.PatternSyntaxException:索引71附近的非法字符范围

java.util.regex.PatternSyntaxException:索引71附近的非法字符范围,java,regex,Java,Regex,[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF] 上面一行显示非法字符范围异常。谁能帮帮我吗 如果我在java代码中直接使用上述行,则不会显示任何错误 Pattern xmlInvalidChars = Pattern.compile("[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\uD800\uDC00-\uDBFF\uDFFF]");

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

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

如果我在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);

我还不能发表评论,所以我将作为答案发布。在字符串中有松散的反斜杠
\uD800\uDC00-\uDBFF\uDFFF
,因此,它将
\u
视为和转义字符,但它不是。只需在剩下的正则表达式中添加两个反斜杠


编辑:在编译模式之前,尝试用双斜线替换单斜线

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

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

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

就是我用了相反的情况。我将单斜杠改为双斜杠(\to\),将双斜杠改为单斜杠(\to)。它现在正在工作。

它不工作……实际上,我正在使用此模式将传入xml文件中的无效字符与CDATA打包。但是这个解决方案不起作用…嗯,可能是因为它正在从文件加载文本字符串?您可以尝试将xml文件中的单斜杠替换为双反斜杠。或者尝试在java内部替换它。相应地编辑我的答案。问题在于
\uDC00-\uDBFF
,此范围不符合顺序。您需要什么来匹配该模式?也许您需要删除连字符以删除故障范围?此外,XML中需要单个反斜杠