Regular Expression bei replace

Bizarrus

Bekanntes Mitglied
Hallo 🙂

Ich versuche bei einem String einen Teil per replace zu entfernen, bekomme die Regular Expression aber in Java nicht hin.

Der String schaut folgendermaßen aus:
|1~1356688608||2~1356688611||3~1356688612||4~1356688614||5~1356688615||6~1356688616|
Und setzt sich wie folgt zusammen:
|ID~UNIX_TIMESTAMP|

Es soll nur ein Teil entfernt, werden wo die ID bekannt ist.

Beispiel:
Java:
int id = 5;
string.replaceAll("|" + id + "~([^|]*)|", "");

Java:
int id = 5;
string.replaceAll("\\|" + id + "~([0-9]+)\\|g?", "");

Ich habe zwar mit RegXp bereits unter PHP und auch Javascript gearbeitet gehabt, nur aber unter Java noch nicht.

Der jeweilige String der entfernt werden soll, soll nur einmalig entfernt werden, egal ob die genannte ID mehrfach vorhanden ist. Hierbei wäre also ggf. replaceAll ein falscher Ansatz, oder?
 
Der jeweilige String der entfernt werden soll, soll nur einmalig entfernt werden, egal ob die genannte ID mehrfach vorhanden ist. Hierbei wäre also ggf. replaceAll ein falscher Ansatz, oder?
🙂Musste ich etwas schmunzeln. Was glaubst Du? Ist "einmalig" ein Widerspruch zu "all"? Die Alternative, die Du suchst könnte übrigens die Methode
Code:
replaceFirst(...)
sein
 
Danke schon einmal für die Methode 🙂
Ja, replaceAll heißt ja "Ersetze Alle", schon klar 😀

Hatte es auch erst einmal probiert gehabt, ob die Regular Expression dort funktioniert, aber ohne erfolgt. Könntest du mir vielleicht sagen, was hier vielleicht schief läuft?
 
In einem anderen länglichen Post zum Thema habe ich zu schrittweisem Vorgehen geraten. Fang erstmal mit einem Teststring und einer einfachen Regex an, z.B. "\\|", teste, bei Erfolg baue den nächsten Teil dazu. So kommst du recht schnell zum Ziel. Deine zweite Expression aus dem Ursprungspost sieht schon ganz gut aus. Nur das "g?" ist fragwürdig. Ich meine, das gehört weg. Was hattest Du denn damit vor?
 
Des g? hatte ich aus einem RegXp tester.
Hatte ich im netz gefunden gehabt und (da ich es nicht so hinbekommen habe) es mal über des Tool gemacht gehabt. Dort hatte es "funktioniert" gehabt und daher kommt auch das "g?".
 
Das sieht mir sehr nach einem Beispiel für die Linux-Kommandozeile aus (evtl. ein awk oder sed Beispiel?). Bei Java-Regexen ist das kleine g (zumal ohne Escape-Zeichen verwendet) genau das, ein kleines g. Haben Dir denn die bisherigen Tipps geholfen? Oder gibt's noch Probleme. Dann wäre das Posten Deines aktuellen Versuchs sicher eine gute Idee.
 
Egal was ich "herumprobiere", ein resultat gibt es nicht.

Original: |1~1356688608||2~1356688611||3~1356688612||4~1356688614||5~1356688615||6~1356688616||7~1356688618||8~1356688620||9~1356688622||10~1356688623||494~1356688624||493~1356688625||492~1356688626||491~1356688628||402~1356688713|

RegXP: \|3~([0-9]+)\|

Nachher: |1~1356688608||2~1356688611||3~1356688612||4~1356688614||5~1356688615||6~1356688616||7~1356688618||8~1356688620||9~1356688622||10~1356688623||494~1356688624||493~1356688625||492~1356688626||491~1356688628||402~1356688713|

Ich habe schon mehrere Sachen probiert. Escapen von ~, escapes weglassen, beim Unix-timestamp mal etwas eher unpassende Dinge probiert wie (.+), (.?), ([^\\|]+),... Irgdnwie will es aber nicht greifen.
 
Ich glaube nicht, dass es an der Regex liegt, sondern daran, dass Du danach wieder die variable
Code:
string
ausliest. replaceFirst(...) gibt den neuen String zurück. Den musst Du dir in einer Variablen speichern und dann den weiterverwenden. Nachfolgendes Codebeispiel sollte alle Fragen klären:
Java:
  public static void main(String[] args) throws Exception {

    String regex = "\\|1~[\\d]+\\|";

    String eingabe = "|1~1356688608||2~1356688611||3~1356688612||4~1356688614||5";
    // Beliebter Fehler, replaceXXX verändert nicht den String,
    // auf dem es aufgerufen wurde (Strings sind übrigens unveränderliche Objekte)
    // Es gibt den veränderten String zurück.
    String replacteEingabe = eingabe.replaceFirst(regex, "");
    
    System.out.println(replacteEingabe);

  }
 
stimmt ... jetzt wo es erwähnt wird ist in deinem code oben nirgends eine neu-zuweisung zu erkennen ...

Strings sind IMMUTABLE ... also un-veränderlich ... ALLE methoden die den String irgendwie verändern geben ein neues objekt zurück ... das alte bleibt allerdings unverändert ...
Java:
string.replaceAll();
macht demzufolge genau NICHTS ... da das ergebnis nicht weiterverarbeitet wird ... korrekt muss es so lauten
Java:
string=string.replaceAll();
 
Ach bin ich doof. Ja, danke - Des hab ich nun auch geckeckt xD
die Methode hat ja ein return-Wert mit den "neuen" Inhalten.

Ok, ich war da zu dem Zeitpunkz anscheinend etwas müde 😀
 
Java:
Pattern p = Pattern.compile("\\|\\d+~(\\d+)\\|");
// ...
Matcher m = p.matcher(input);
List<String> ids = new ArrayList<String>();
while (m.find()) {
    ids.add(m.group(1));
}
 

Neue Themen


Zurück
Oben