【问题标题】:java.util.regex.PatternSyntaxException: Illegal character range near index 71java.util.regex.PatternSyntaxException:索引 71 附近的字符范围非法
【发布时间】:2017-05-25 11:08:14
【问题描述】:

[^\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);

【问题讨论】:

  • 问题出在\uDC00-\uDBFF,这个范围有问题。您需要与模式匹配什么?也许您需要删除连字符以删除错误范围?此外,您需要在 XML 中使用单个反斜杠。
  • 正如@WiktorStribiżew 所说,参考en.wikipedia.org/wiki/UTF-8#Invalid_code_points

标签: java regex


【解决方案1】:

我还不能发表评论,所以我会发布作为答案。在您的字符串中,您有松散的反斜杠\uD800\uDC00-\uDBFF\uDFFF,因此,它将\u 视为和转义字符,但事实并非如此。只需添加双反斜杠作为正则表达式的其余部分。


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

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

【讨论】:

  • 它不起作用...实际上我正在使用此模式用 CDATA 包装传入 xml 文件中存在的无效字符。但是这个解决方案不起作用......
  • 嗯,也许是因为它正在从文件中加载文字字符串?您可以尝试将 xml 文件中的单斜杠替换为双反斜杠。或尝试在java中替换它。相应地编辑我的答案。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多