2010-10-23 4 views

Répondre

68

Un peu plus concis:

String in = "Item(s): [item1.test],[item2.qa],[item3.production]"; 

Pattern p = Pattern.compile("\\[(.*?)\\]"); 
Matcher m = p.matcher(in); 

while(m.find()) { 
    System.out.println(m.group(1)); 
} 
0

Je diviser après la coupe indésirable précédent ou de fuite:

String s = "Item(s): [item1.test], [item2.qa],[item3.production] "; 
String r1 = "(^.*?\\[|\\]\\s*$)", r2 = "\\]\\s*,\\s*\\["; 
String[] ss = s.replaceAll(r1,"").split(r2); 
System.out.println(Arrays.asList(ss)); 
// [item1.test, item2.qa, item3.production] 
+0

Gardez à l'esprit que ce ne supporte pas les supports imbriqués. – Gabe

+0

La solution ci-dessus ne fonctionne pas du tout, si elle est imbriquée ou non. – nottinhill

+0

@Stephan Kristyn: travaille pour moi sur Java 1.6 sous Mac OS X 10.6.7. – maerics

5

Vous devez utiliser un test avant positif et lookbehind:

(?<=\[)([^\]]+)(?=\]) 
  • (? < = [) Correspond à everythi ng suivi par [
  • ([^]] +) correspond à toute chaîne ne contenant pas]
  • (? =]) Accorde à tout avant]
+0

Génial, mais comment puis-je obtenir le résultat inverse? Je ne souhaite pas que le contenu soit entre crochets – candlejack

+0

Je ne comprends pas votre question - c'est exactement ce que fait cette expression. Prenant entrée 'objet (s): [item1.test], [item2.qa], [item3.production]' il retourne '' item1.test' item2.qa' 'item3.production' – gnom1gnom

Questions connexes