未公开的字符类错误?

时间:2014-02-16 21:19:11

标签: java regex split

这是错误:

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

这个错误意味着什么以及需要做些什么来修复上面的代码?

5 个答案:

答案 0 :(得分:38)

String#split使用正则表达式,但[(和])不是标准字符,“正则表达式”。因此,他们需要转义 - 使用\[(以及\])。

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

因此,只需要在[上拆分,所使用的Java String就是"\\[";而你正试图获得:

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

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

Pattern#quote用于表示:

  

您的模式中的元字符[...]将没有特殊含义。

(来自上面链接的Javadoc)

在这种情况下,我建议你使用以下内容(理论上更明智和可读):

.split(Pattern.quote("], ["))

答案 1 :(得分:5)

Split接收正则表达式,[,]字符在正则表达式中有意义,因此您应该使用\\[\\]来转义它们。

你当前正在这样做的方式,解析器找到一个没有前面的[因此它会引发错误。

答案 2 :(得分:2)

String.split()采用正则表达式,而不是普通字符串作为参数。在正则表达式中,]和[是特殊字符,需要在字面上采用反斜杠。使用.split("\\], \\[")。 (双反斜杠告诉Java将字符串解释为&#34; \],\ [&#34;)。

答案 3 :(得分:1)

  .split("], [")
             ^---start of char class
                  end----?

将其更改为

.split("], \[")
           ^---escape the [

答案 4 :(得分:0)

尝试使用它

 String stringToSplit = "8579.0,753.34,796.94,\"[784.2389999999999,784.34]\",\"[-4.335912230999999, -4.3603307895,4.0407909059, 4.08669583455]\",[],[],[],0.1744,14.4,3.5527136788e-15,0.330667850653,0.225286999939,Near_Crash";
 String [] arraySplitted = stringToSplit.replaceAll("\"","").replaceAll("\\[","").replaceAll("\\]","").trim().split(",");