未关闭的字符类错误?TL;DR解释

2022-09-01 21:41:37

这是错误:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 3
], [
   ^
    at java.util.regex.Pattern.error(Pattern.java:1924)
    at java.util.regex.Pattern.clazz(Pattern.java:2493)
    at java.util.regex.Pattern.sequence(Pattern.java:2030)
    at java.util.regex.Pattern.expr(Pattern.java:1964)
    at java.util.regex.Pattern.compile(Pattern.java:1665)
    at java.util.regex.Pattern.<init>(Pattern.java:1337)
    at java.util.regex.Pattern.compile(Pattern.java:1022)
    at java.lang.String.split(String.java:2313)
    at java.lang.String.split(String.java:2355)
    at testJunior2013.J2.main(J2.java:31)

这是导致问题的代码区域。

String[][] split = new String[1][rows];

split[0] = (Arrays.deepToString(array2d)).split("], ["); //split at the end of an array row

此错误是什么意思,需要做些什么来修复上面的代码?


答案 1

TL;DR

你想要:

.split("\\], \\[")`

对每个方括号进行两次转义 — 对于需要从其特殊含义中去除它们的每个上下文,一次是:首先在正则表达式中,其次是在 Java 字符串中。

当您需要按字面解释整个模式时,请考虑使用Pattern#quote


解释

String#split适用于正则表达式,但不是正则表达式的标准字符:它们在该上下文中具有特殊含义。[]

为了从它们的特殊含义中剥离出来并简单地匹配实际的方括号,需要对它们进行转义,这是通过在每个方括号前面加上反斜杠来完成的 - 即使用和。\[\]

但是,在Java字符串中,它也不是标准字符,也需要转\

因此,只是为了拆分,使用的字符串是,您正在尝试获得:["\\["

.split("\\], \\[")

明智的选择

但是,在这种情况下,您不仅仅是在语义上转义正则表达式中的几个特定字符,而是实际上希望从字面上解释您的整个模式:有一种方法可以做到这一点


答案 2