2012-07-13 23 views
6

¿Hay una manera de transformar la cadenagrupos de expresiones regulares Java reemplazos

"m1, m2, m3" 

a la siguiente

"m1/build, m2/build, m3/build" 

sólo mediante el uso String.replaceAll(regex, replacement) método?

Hasta ahora, este es mi mejor intento:

System.out.println("m1, m2, m3".replaceAll("([^,]*)", "$1/build")); 
>>> m1/build/build, m2/build/build, m3/build/build 

Como se puede ver, la salida es incorrecto. Sin embargo, utilizando la misma expresión regular al mando de Linux sed da salida correcta:

echo 'm1, m2, m3' | sed -e 's%\([^,]*\)%\1/build%g' 
>>> m1/build, m2/build, m3/build 

Respuesta

4

([^,]*) puede coincidir con la cadena vacía, incluso puede coincidir entre dos espacios. Pruebe ([^,]+) o (\w+).

Otra nota de menor importancia - se puede utilizar $0 para referirse a toda emparejado la cadena, evitando el grupo capturado: (literalmente)

System.out.println("m1, m2, m3".replaceAll("\\w+", "$0/build")); 
+0

+1 Sip, ese parece ser el problema: http://ideone.com/omXQF – mellamokb

5

Si nos fijamos en el problema desde el otro extremo se obtiene una expresión que busca terminadores, en lugar de buscar contenido. Esta expresión trabajó mucho mejor:

System.out.println("m1, m2, m3".replaceAll("(\\s*(,|$))", "/build$1")); 

Aquí es a link to this program on ideone.

+0

Esa es la forma en que estaba pensando hacerlo. ¿Pero no tienes/build y $ 1 intercambiado? – BlackVegetable

+1

@BlackVegetable Dado que estoy haciendo coincidir el terminador, no el contenido, el '$ 1' pertenece al final. – dasblinkenlight

+0

Huh, es bueno saberlo! Gracias por la aclaración. +1 – BlackVegetable

Cuestiones relacionadas