2010-10-23 21 views

Respuesta

68

Un poco más concisa:

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

sin dividir, después del corte anterior o al final no deseado:

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

Tenga en cuenta que esto no va a apoyar corchetes anidados. – Gabe

+0

La solución anterior no funciona en absoluto, si está anidada o no. – nottinhill

+0

@Stephan Kristyn: funciona para mí en Java 1.6 en Mac OS X 10.6.7. – maerics

5

se debe utilizar una búsqueda positiva hacia delante y de búsqueda hacia atrás:

(?<=\[)([^\]]+)(?=\]) 
  • (? < = [) Coincide con everythi ng seguido por [
  • ([^]] +) coincide con cualquier cadena que no contenga]
  • (? =]) coincide con todo antes]
+0

Impresionante, pero ¿cómo puedo obtener el resultado opuesto? Quiero preservar solo el contenido entre corchetes – candlejack

+0

No entiendo su pregunta, eso es exactamente lo que hace esta expresión regular. Tomando entrada 'Artículo (s): [item1.test], [item2.qa], [item3.production]' que devuelve 'item1.test' ' item2.qa' 'item3.production' – gnom1gnom

Cuestiones relacionadas