2010-02-24 9 views
6

Necesito reemplazar una palabra en una cadena que parezca "duh duh something else duh". Solo necesito reemplazar el segundo "duh", pero el primero y el último deben permanecer intactos, así que replace() y replaceFirst() no funcionan. ¿Hay algún método como replaceFirst (String regex, String replacement, int offset) que reemplace la primera aparición de reemplazo a partir de la compensación, o tal vez recomendaría otra forma de resolverlo? Gracias!Java String.replaceFirst() que toma el argumento "starting from"

Respuesta

9

¿Qué pasa algo como esto:

String replaceFirstFrom(String str, int from, String regex, String replacement) 
{ 
    String prefix = str.substring(0, from); 
    String rest = str.substring(from); 
    rest = rest.replaceFirst(regex, replacement); 
    return prefix+rest; 
} 

// or 
s.substring(0,start) + s.substring(start).replaceFirst(search, replace); 

sólo 1 línea de código ... no es un método conjunto.

+0

Ok, esto es exactamente lo que necesitaba, ¡gracias! – Slavko

4

¿Funcionará algo como esto?

System.out.println(
    "1 duh 2 duh duh 3 duh" 
    .replaceFirst("(duh.*?)duh", "$1bleh") 
); // prints "1 duh 2 bleh duh 3 duh" 

Si lo que desea es reemplazar la segunda aparición de un patrón en una cadena, que realmente no necesito esto "a partir de" cálculo del índice.

Como una ventaja, si quiere reemplazar a cualquier otro duh (es decir, segundo, cuarto, sexto, etc.), simplemente invoque replaceAll en lugar de replaceFirst.

+0

replaceAll no reemplazará a todos los demás duhs, ya que no se reiniciará siempre desde el principio. Realmente dará 1duh2blehduh3bleh –

+2

que está reemplazando a todos los demás 'duh' como dije! – polygenelubricants

+2

"Es un día alterno, hoy no es otro día, ya sabes". –

2

Una alternativa usando Matcher:

String input = "duh duh something else duh"; 
Pattern p = Pattern.compile("duh"); 
Matcher m = p.matcher(input); 
int startIndex = 4; 

String output; 

if (m.find(startIndex)) { 
    StringBuffer sb = new StringBuffer(); 
    m.appendReplacement(sb, "dog"); 
    m.appendTail(sb); 
    output = sb.toString(); 
} else { 
    output = input; 
} 
Cuestiones relacionadas