2010-02-24 14 views
6

Devo sostituire una parola in una stringa simile a "duh duh qualcos'altro". Ho solo bisogno di sostituire il secondo "duh", ma il primo e l'ultimo devono rimanere intatti, quindi replace() e replaceFirst() non funzionano. Esiste un metodo come replaceFirst (String regex, String replacement, int offset) che sostituisce la prima occorrenza di sostituzione a partire dall'offset, o forse consiglieresti un altro modo per risolvere questo problema? Grazie!Java String.replaceFirst() che accetta un argomento "a partire da"

risposta

9

Che dire qualcosa di simile:

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); 

solo 1 riga di codice ... non è un metodo complesso.

+0

Ok, questo è esattamente quello di cui avevo bisogno, grazie! – Slavko

4

Qualcosa come questo funziona?

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

Se si desidera solo per sostituire la seconda occorrenza di un modello in una stringa, davvero non hanno bisogno di questo "a partire da" calcolo degli indici.

Come bonus, se si desidera sostituire ogni altro duh (vale a dire secondo, quarto, sesto, ecc.), Quindi basta chiamare replaceAll anziché replaceFirst.

+0

replaceAll non sostituirà tutti gli altri duh, poiché non si riavvia dall'inizio ogni volta. In realtà darà 1duh2blehduh3bleh –

+2

Che sta sostituendo ogni altro 'duh' come ho detto! – polygenelubricants

+2

"È marmellata un giorno sì e uno no, oggi non è nessun altro giorno, lo sai." –

2

Un'alternativa utilizzando 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; 
} 
Problemi correlati