2016-04-18 2 views
0

ich die nächste String in Java haben:Ersetzen Wert in einem regex

|ABC|50200|100|50200|200|PRUEBA|ABC|20150220184512| 

Also muss ich den Wert nach |50200| (zweite) mit anderen Wert ersetzen, um einige Entscheidungen, müssen aber nur die zweite ersetzen Eine, wie kann ich tun, da ersetzen oder ersetzenAlle in diesem Fall nicht funktionieren. Ich war mit einigen regex und appendReplacement versucht, aber es hat nicht funktioniert, auch muß ich es so schnell wie möglich sein, Code unter:

String event = "|ABC|50200|100|50200|200|PRUEBA|ABC|20150220184512|"; 
Pattern p = Pattern.compile("^\|(\w*)\|(\d+)\|(\d+(\.\d{1,})*)\|(\d+(\.\d{1,})*)\|(\d+(\.\d{1,})*)\|\w+\|\w+\|\d{14}\|$"); 
Matcher mat = p.matcher(event); 
StringBuffer aux = new StringBuffer(); 
mat.appendReplacement(aux, mat.group(5)); 
String newString = aux.toString(); 

Aber der Wert des Neuerstring ist 50200, so dass im Grunde möchte ich es ersetzen mit 12345, so würde der String so aussieht |ABC|50200|100|12345|200|PRUEBA|ABC|20150220184512|

Vielen Dank im Voraus für Ihre Hilfe

die Sache ist, ich habe die Regex zu verwenden, um das Format der Zeichenfolge zu überprüfen, bevor die ersetzen tun, weil es sein könnte, andere String mit verschiedenen Formaten

+1

1. Haben Sie einen regulären Ausdruck verwenden? 2. Ist es immer die zweite Gruppe? – KevinO

+3

Warum ein Regex? Das Format ist einfach genug. Finde das 4. '|' und ersetze die nächsten 5 Zeichen. grundlegende String-Operationen, keine Notwendigkeit einer Regex-Engine. –

Antwort

0

Sie können indexOf verwenden, um die zweite Position zu finden, dann substring um den Wert, den Sie ersetzen möchten.

Zum Beispiel

public static void main(String[] args) { 
    String s = "|ABC|50200|100|50200|200|PRUEBA|ABC|20150220184512|"; 

    String find = "50200"; 
    String replace = "12345"; 

    int firstOccur = s.indexOf(find); 
    int secondOccur = s.indexOf(find, firstOccur+find.length()); 

    StringBuilder sb = new StringBuilder(s.substring(0, secondOccur)); 
    sb.append(replace); 
    sb.append(s.substring(secondOccur+find.length())); 

    System.out.println(sb.toString()); 
    // |ABC|50200|100|12345|200|PRUEBA|ABC|20150220184512| 
} 
0

Seit Frage getaggt wurde als regex und nicht-regex Lösung ist möglich, aber ein bisschen länglich hier ist eine einfache Linie regex Lösung:

String data = "|ABC|50200|100|50200|200|PRUEBA|ABC|20150220184512|"; 
String srch = "|50200|"; 
String repl = "|12345|"; 

String rdata = data.replaceFirst("^(.*?(\\|50200\\|).*?)\\2", "$1|12345|"); 
//=> |ABC|50200|100|12345|200|PRUEBA|ABC|20150220184512| 

Regex ^(.*?(\|50200\|).*?)\2 Funde 2. Instanz von |50200| und erfasst alles vor der 2. Instanz in die gefangene Gruppe # 1. Wir verwenden die Backreference $1 als Ersatz, um den erfassten Text zurückzugeben.

RegEx Demo

+0

dieser funktioniert perfekt, wenn der erste und der zweite gleich sind, aber es kann auch passieren, dass beide Werte unterschiedlich sind, aber ich muss den zweiten ändern, egal was – Alex

+0

In diesem Fall verwende: ** 'rdata = data.replaceFirst ("^ (. *? \\ | 50200 \\ |. *?) \\ | 56789 \\", "$ 1 | 12345 |"); '** – anubhava

+0

Hat das jetzt funktioniert? – anubhava