2014-02-16 49 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(",");