2014-02-16 52 views
8

以下是错误:未封闭的字符类错误?

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 

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

回答

24

String#split作品有正则表达式[(和])不规范字, “正则表达式明智”。所以,他们需要转义 - 使用\[(和\])。

然而,在的JavaString\是不是一个标准的字符要么,并需要逃脱以及。因此,仅仅为了在[上分割,所使用的Java String"\\[";因此,仅在[上分割,所使用的Java String"\\[";你试图获取:

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

然而,在这种情况下,你不只是语义在正则表达式逃逸几个特定的​​字符,但实际上希望的是整个图案是字面解释:有做到这一点

Pattern#quote使用一种方法来表示该:

Metacharacters [...] in your pattern will be given no special meaning.

(从上面链接的Javadoc)

我建议,在这种情况下,您使用以下(argurably更加理智和可读性):

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

这只是我正在寻找的答案,谢谢。在什么情况下应该使用'Pattern.quote'而不是标准的'.split(“\\],[\\”)'? –

+0

你“应该”总是使用'Pattern.quote',因为它等于自己逃避正则表达式字符串......但是使用它,你确信你不会忘记任何东西,除此之外,它更具可读性,在我的意见:) – ccjmne

5

Split收到一个正则表达式,[,]字符在正则表达式中有意义,所以你应该用\\[\\]来转义它们。

你现在正在这样做的方式,解析器找到一个没有前面的[所以它会抛出该错误。

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

将其更改为

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

对不起,你能不能解释一下? –

2

String.split()需要定期表达式,不是一个普通的字符串作为参数。在一个正则表达式中,]和[是特殊字符,它们需要在字面上加上反斜杠。使用.split("\\], \\[")。 (双反斜杠告诉Java将字符串解释为“\],\ [”)。

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(",");