ここにエラーがあります:
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
このエラーは何を意味し、上記のコードを修正するために何をする必要がありますか?
String#split
は正規表現で機能しますが、[
(および]
)は「正規表現」の標準文字ではありません。したがって、エスケープする必要があります— \[
(および\]
)を使用します。
ただし、JavaString
では、\
も標準文字ではないため、エスケープする必要があります同様に。
したがって、[
で分割するために、使用されるJava String
は"\\["
;であり、次のものを取得しようとしています。
.split("\\], \\[")
ただし、この場合、意味的に正規表現内の特定の文字をいくつかエスケープするだけでなく実際にパターン全体が解釈されることを望んでいます。文字通り:それだけを行う方法があります????
Pattern#quote
は、次のことを示すために使用されます。
パターン内のメタ文字[...]には特別な意味はありません。
(上記にリンクされているJavadocから)
この場合、以下を使用することをお勧めします(おそらくより賢明で読みやすい)。
.split(Pattern.quote("], ["))
スプリットは正規表現を受け取り、[、]文字は正規表現で意味を持つため、\\[
および\\]
でエスケープする必要があります。
あなたが現在それをしている方法では、パーサーは先行する[なしで]を見つけるので、そのエラーをスローします。
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(",");