web-dev-qa-db-fra.com

Erreur de classe de caractères non fermée?

Voici l'erreur:

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)

C'est le domaine du code qui cause les problèmes.

String[][] split = new String[1][rows];

split[0] = (Arrays.deepToString(array2d)).split("], ["); //split at the end of an array row

Que signifie cette erreur et que faut-il faire pour corriger le code ci-dessus?

9
ylun.ca

String#split fonctionne avec un expression régulière mais [ (et ]) ne sont pas des caractères standard, "regex-wise". Donc, ils doivent être échappés - en utilisant \[ (et \]).

Cependant, dans un JavaString, \ n'est pas non plus un caractère standard, et doit être également échappé.

Ainsi, juste pour diviser sur [, la String Java utilisée est "\\["; et vous essayez d'obtenir:

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

Cependant, dans ce cas, vous n'êtes pas seulement sémantiquement échappant à quelques caractères spécifiques dans une expression régulière, mais vous souhaitez réellement que tout votre modèle soit interprété littéralement: il existe une méthode pour le faire ?? ??

Pattern#quote est utilisé pour indiquer que le:

Les métacaractères [...] de votre modèle n'auront aucune signification particulière.

(à partir du lien Javadoc ci-dessus)

Dans ce cas, je vous recommande d’utiliser ce qui suit (sans conteste plus sensible et lisible):

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

Split reçoit une expression rationnelle et les caractères [] ont une signification dans l'expression rationnelle. Vous devez donc les échapper avec \\[ et \\]

Dans l’état actuel des choses, l’analyseur trouve un] sans précédent [donc jette cette erreur.

5
xp500

String.split () prend un expression régulière , pas une chaîne normale en tant qu'argument. Dans une expression régulière,] et [sont des caractères spéciaux, qui doivent être précédés de barres obliques inverses pour être pris littéralement. Utilisez .split("\\], \\["). (les doubles barres obliques inverses indiquent à Java d'interpréter la chaîne comme suit: "\],\[").

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

Le changer en 

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

Essayez de l'utiliser 

 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