2012-07-13 14 views
6

C'è un modo per trasformare la stringaJava gruppi regexp sostituzioni

"m1, m2, m3" 

al seguente

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

solo utilizzando String.replaceAll(regex, replacement) metodo?

Finora questo è il mio miglior tentativo:

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

Come si può vedere l'uscita non è corretta. Tuttavia, utilizzando la stessa regexp comando di Linux sed dà output corretto:

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

risposta

4

([^,]*) può corrispondere alla stringa vuota, può anche corrispondere tra due spazi. Prova ([^,]+) o (\w+).

Un'altra nota minore - è possibile utilizzare $0 per fare riferimento a tutto il testo trovato, evitando il gruppo catturato: (! Letteralmente)

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

+1 Sì, questo sembra essere il problema: http://ideone.com/omXQF – mellamokb

5

Se si guarda il problema dall'altro capo si ottiene un espressione che cerca terminatori, piuttosto che per il contenuto. Questa espressione ha funzionato molto meglio:

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

Ecco a link to this program on ideone.

+0

Questo è il modo in cui stavo pensando di farlo. Ma non hai/build e $ 1 scambiati? – BlackVegetable

+1

@BlackVegetable Dal momento che sto facendo corrispondere il terminatore, non il contenuto, il '$ 1' appartiene alla fine. – dasblinkenlight

+0

Huh, buono a sapersi! Grazie per il chiarimento. +1 – BlackVegetable