2010-02-24 8 views
6

Ich muss ein Wort in einer Zeichenfolge wie "duh duh etwas anderes duh" ersetzen. Ich muss nur das zweite "duh" ersetzen, aber das erste und das letzte müssen unberührt bleiben, also funktionieren replace() und replaceFirst() nicht. Gibt es eine Methode wie replaceFirst (String regex, Ersetzen von Zeichenfolgen, int offset), die das erste Auftreten von Ersetzungen ab Offset ersetzen würde, oder würden Sie vielleicht eine andere Möglichkeit zur Lösung dieses Problems empfehlen? Danke!Java String.replaceFirst(), das ein "Start von" Argument

Antwort

9

Was ist so etwas wie dieses:

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

nur 1 Zeile Code ... nicht eine ganze Methode.

+0

Ok, das ist genau das, was ich brauchte, danke! – Slavko

4

Funktioniert so etwas?

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

Wenn Sie nur das zweite Auftreten eines Musters in einer Zeichenfolge ersetzen möchten, was Sie wirklich brauchen nicht diese Indexberechnung „von Start“.

Als Bonus, wenn Sie alle anderen duh (d. H. Zweiten, vierten, sechsten usw.) ersetzen möchten, rufen Sie einfach replaceAll anstelle von replaceFirst.

+0

replaceAll ersetzt nicht alle anderen duhs, da es nicht jedes Mal von Anfang an neu gestartet wird. Es wird tatsächlich geben 1duh2blehduh3bleh –

+2

Welches ersetzt jedes andere 'duh' wie ich schon sagte! – polygenelubricants

+2

"Es ist jeden zweiten Tag Marmelade; heute ist kein anderer Tag, weißt du." –

2

Eine Alternative mit 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; 
}