簡體   English   中英

未關閉的字符類錯誤?

[英]Unclosed Character Class Error?

這是錯誤:

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

這個錯誤是什么意思,需要做什么來修復上面的代碼?

TL; 博士

你要:

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

每個方括號進行兩次轉義— 對於需要將它們從其特殊含義中剝離的每個上下文一次:首先在正則表達式中,然后在Java 字符串中

當您需要按字面解釋整個模式時,請考慮使用Pattern#quote


解釋

String#split正則表達式一起使用,[]不是標准字符,正則表達式:它們在該上下文中具有特殊含義。

為了將它們從它們的特殊含義中剝離出來並簡單地匹配實際的方括號,它們需要被轉義,這是通過在每個前面加上一個反斜杠來完成的——即使用\\[\\]

但是,在Java String 中\\也不是標准字符,也需要轉義

因此,只是為了拆分[ ,使用的字符串"\\\\["並且您試圖獲得:

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

一個明智的選擇

但是,在這種情況下,您不僅在語義上對正則表達式中的幾個特定字符進行了轉義,而且實際上希望從字面上解釋您的整個模式:有一種方法可以做到這一點🙂

Pattern#quote用於表示:

模式中的元字符 [...] 沒有特殊含義。

(來自上面鏈接的Javadoc)

在這種情況下,我建議您使用以下更明智和可讀的內容:

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

Split 接收正則表達式,而 [, ] 字符在正則表達式中有意義,因此您應該使用\\\\[\\\\]它們轉義。

按照您目前的做法,解析器會找到一個沒有前面 [ 的 ],因此它會拋出該錯誤。

String.split() 接受一個正則表達式,而不是一個普通的字符串作為參數。 在正則表達式中,] 和 [ 是特殊字符,需要在前面加上反斜杠才能按字面意思理解。 使用.split("\\\\], \\\\[") (雙反斜杠告訴 Java 將字符串解釋為“\\]、\\[”)。

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

將其更改為

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

嘗試使用它

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM