1. ホーム
  2. ジャワ

[解決済み】Unclosed Character Class Error?

2022-04-30 21:32:27

質問

以下はそのエラーです。

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;DR

あなたが欲しいのは

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

脱出 各角括弧 2回 - を特別な意味から取り除く必要がある場合、それぞれの文脈で1回ずつ行います。 正規表現 を最初に、そしてその中に Java文字列 次に

の使用を検討します。 Pattern#quote が必要な場合は 全パターン を解釈することができます。 文字通り .


説明

String#split が動作します。 正規表現 しかし [] は正規表現上、標準的な文字ではありません:この文脈では特別な意味を持ちます。

を行うには 特別な意味から取り除く で、単に 実際の角かっこと一致する である必要があります。 エスケープ これは、それぞれの前に バックスラッシュ - つまり \[\] .

しかし Java 文字列 , \ も標準的な文字ではないので、以下のようにする必要があります。 もエスケープされます。 .

したがって、ちょうど分割するために [ は、その 文字列 が使用されます。 "\\[" と取得しようとしている。

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


賢明な代替案

ただし、この場合、意味的にだけでなく 正規表現で特定の数文字をエスケープする場合 という願いが込められています。 パターン全体が文字通りに解釈される そのための方法があるのですか?

Pattern#quote が使われていることを意味する。

パターン内のメタキャラクタ[...]は特別な意味を持ちません。

(上記リンク先のJavadocより)

この場合、より感覚的で読みやすい、以下のようなものを使うことをお勧めします。

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