web-dev-qa-db-ja.com

閉じられていない文字クラスエラー?

ここにエラーがあります:

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

このエラーは何を意味し、上記のコードを修正するために何をする必要がありますか?

15
ylun.ca

String#split正規表現で機能しますが、[(および])は「正規表現」の標準文字ではありません。したがって、エスケープする必要があります\[(および\])を使用します。

ただし、JavaStringでは、\も標準文字ではないため、エスケープする必要があります同様に

したがって、[で分割するために、使用されるJava String"\\[";であり、次のものを取得しようとしています。

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

ただし、この場合、意味的に正規表現内の特定の文字をいくつかエスケープするだけでなく実際にパターン全体が解釈されることを望んでいます。文字通り:それだけを行う方法があります????

Pattern#quote は、次のことを示すために使用されます。

パターン内のメタ文字[...]には特別な意味はありません。

(上記にリンクされているJavadocから)

この場合、以下を使用することをお勧めします(おそらくより賢明で読みやすい)。

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

スプリットは正規表現を受け取り、[、]文字は正規表現で意味を持つため、\\[および\\]でエスケープする必要があります。

あなたが現在それをしている方法では、パーサーは先行する[なしで]を見つけるので、そのエラーをスローします。

5
xp500

String.split()は、引数として通常の文字列ではなく正規表現を取ります。正規表現では、]と[は特殊文字であり、文字どおりに解釈するには、バックスラッシュを前に付ける必要があります。 .split("\\], \\[")を使用します。 (二重のバックスラッシュはJavaで文字列を "\]、\ ["と解釈するように指示します)。

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

に変更

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

それを使ってみてください

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