2012-03-07 4 views
1

J'ai une chaîne en Java. Voici la partie qui me concerne {3: {108:TR2011052300088}}String.split (pattern) génère une exception due à {in pattern: java.util.regex.PatternSyntaxException

Plus tard, je fais une division sur {3: {108:. Pour une raison quelconque (j'ai été googling) { et } est un caractère spécial donc il doit être échappé \} et \{ (clairement cela ne fonctionne pas -> erreur de compilation).

D'autres mentionnent qu'il s'agit d'un bug dans Java regex. Je ne suis pas sûr vraiment. L'exception que je reçois est:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed counted closure near index 2 {3:{108: at java.util.regex.Pattern.error(Unknown Source)

Longue histoire courte, mon code divise la chaîne en utilisant {3: {108: comme séparateur et se écrase sur elle:

String query="{3: {108:"; 
String [] messageParts = message.split(query); 

Je suis au courant d'autres façons de le faire, bien que plus compliqué, comme l'écriture de mon propre analyseur et autres.

Comment est-ce que je peux faire mon partage de chaîne et ne pas l'avoir plantage?

EDIT: Pour répondre à certains commentaires:
- Double barres obliques ne permettent pas: \\{ donner \{3:\{108:MAMABEARid123}} depuis le 2 barres obliques deviennent 1
- Echapper avec 1 slash ne compilera pas: non valide séquence d'échappement

+0

Peut-être que l'échappement de '}' serait utile? Il vous dit qu'il essaie d'interpréter les crochets. –

+0

oui, mais comment puis-je leur échapper? '\ {' ne fonctionne pas. – Adrian

+0

Quand vous dites "clairement ceci ne fonctionne pas" il serait utile de dire de quelle manière * cela n'a pas fonctionné. –

Répondre

6

Exemple pour échapper à la {:

public static void main(String[] args) { 
     String s = "{3: {108:TR2011052300088}}"; 
     String[] ss = s.split("\\{3: \\{108:"); 
     System.out.println(ss[1]); //prints TR2011052300088}} 
    } 
+0

il s'avère que j'ai dû faire une construction propre de mon projet afin d'être capable d'ajouter \\ {à une chaîne. Juste pour info, je combine le motif avec le résultat de la scission afin que s'échappe différemment quand je l'imprime – Adrian

0

En supposant que vous n'avez pas vraiment besoin expressions régulières, je voudrais Guava classe Splitter.

private static final Splitter SPLITTER = Splitter.on("{3: {108:"); 

... 

Iterable<String> bits = SPLITTER.split(messageParts); 

(Vous pouvez utiliser Iterables.toArray pour créer un tableau de cela, ou Lists.newArrayList pour une liste, ou autre ...)

0

Retirez les accolades, puis divisés sur deux points:

String inp = "{3: {108:TR2011052300088}}";

System.out.println(inp.replaceAll("[\\{\\}]", "").split(":")[2])

Prints de TR2011052300088 '

+0

cela pourrait fonctionner! vous supposez que je veux la partie TR;) – Adrian

+0

@adrian, c'était juste une conjecture – Kennet

-2

Utiliser [{] ..... J'ai travaillé avec Regex pour les messages Swift avant

+0

soin d'expliquer pourquoi cela devrait fonctionner? – katzenhut