未公开的字符类错误?
这是错误:
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.(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
这个错误意味着什么以及需要做些什么来修复上面的代码?
String#split
与正则表达式一起使用,但[
(和]
)不是标准字符,“正则表达式”。 因此,他们需要进行转义 – 使用\[
(和\]
)。
但是,在Java String
, \
也不是标准字符,也需要进行转义 。
因此,只需要拆分[
,使用的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(",");