replaceAll und RegExp
Micha
- java
Hallo,
ich möchte aus einem in XML serialisiertem Objekt ein paar Tags löschen. Beim einlesen liegt zunächst ein (XML-)String vor.
Ich möchte eine Block löschen, den ich im Beispielcode mit par bezeichnet habe. Dieser Block par soll mit seinen Unterelementen verschwinden.
String s = " <foo>0.1</foo>\r\n" +
" <par>\r\n" +
" <bar>123</bar>\r\n" +
" <baz>456</baz>\r\n" +
" </par>\r\n";
s = s.replaceAll("<par>.*?</par>", "");
System.out.println("Testausgabe "+ s);
Ich dachte mit .* würde ich ein beliebiges Zeichen beliebig oft erwischen. Der Zeilenumbruch scheint jedoch nicht dabei zu sein, sodass der Block nicht gefunden wird.
Das hinzufügen von Whitspaces funktioniert jedoch auch nicht (sofern es so korrekt ist). s = s.replaceAll("<par>[\\s.]*?</par>", "");
Einer eine Idee?
Mit freundlichem Gruß
Micha
Hi,
Ich dachte mit .* würde ich ein beliebiges Zeichen beliebig oft erwischen.
ein beliebiges Zeichen, das kein Umbruch ist, es sei denn Du gibst die Option /s mit an.
Das hinzufügen von Whitspaces funktioniert jedoch auch nicht (sofern es so korrekt ist).
s = s.replaceAll("<par>[\\s.]*?</par>", "");
Nein, in einer Zeichenklasse steht das Symbol "." für einen Punkt.
Cheatah
Hallo Cheatah,
Danke für Deine Antwort.
Nein, in einer Zeichenklasse steht das Symbol "." für einen Punkt.
Aha, verstehe, sollte dann s = s.replaceAll("<par>[\\s\\.]*?</par>", "");
mir nicht das gewünschte Resultat liefern?
Mit freundlichem Gruß
Micha
Hi,
Nein, in einer Zeichenklasse steht das Symbol "." für einen Punkt.
Aha, verstehe, sollte danns = s.replaceAll("<par>[\\s\\.]*?</par>", "");
mir nicht das gewünschte Resultat liefern?
ein Zeichen zu escapen, das nur für das genannte Zeichen steht, macht aus diesem Zeichen nicht plötzlich etwas völlig anderes. Innerhalb der Zeichenklasse ist der Punkt nur und ausschließlich der Punkt - Punkt! Er hat die selbe Wirkung wie z.B. das Zeichen "a", nur dass "a" für ein "a" steht, "." für ein ".".
Cheatah
Hallo Cheatah,
ein Zeichen zu escapen, das nur für das genannte Zeichen steht, macht aus diesem Zeichen nicht plötzlich etwas völlig anderes.
Naja, aus dem Zeichen s, in meinem Beispiel, wird ja letztlich auch ein Whitespace beim Punkt ist das als nicht der Fall? (das doppelte Escapen ist in Java nötig)
Mit freundlichem Gruß
Micha
Hallo Cheatah,
habs jetzt mit s = s.replaceAll("<par>[\\w.</>\\s]*</par>", "");
hinbekommen.
Mit freundlichem Gruß
Micha
Hi,
habs jetzt mit
s = s.replaceAll("<par>[\\w.</>\\s]*</par>", "");
hinbekommen.
dann solltest Du dies noch einmal revidieren und das verwenden, was ich Dir im vorhergegangenen Posting genannt habe. Eine Zeichenklasse mit einem winzigen Satz einzelner Zeichen ist etwas signifikant anderes als die Veränderung des Symbols für "alle Zeichen außer Umbrüche" zu "alle Zeichen".
Cheatah
Hallo Cheatah,
dann solltest Du dies noch einmal revidieren und das verwenden, was ich Dir im vorhergegangenen Posting genannt habe.
Du meinst sicher:
ein beliebiges Zeichen, das kein Umbruch ist, es sei denn Du gibst die Option /s mit an.
Das habe ich natürlich erfolglos versucht, wie Du Dir denken kannst, wobei ich es so interpretiert habe: s.replaceAll("/<par>.*</par>/s", "");
Eine Zeichenklasse mit einem winzigen Satz einzelner Zeichen ist etwas signifikant anderes als die Veränderung des Symbols für "alle Zeichen außer Umbrüche" zu "alle Zeichen".
Ja, ich weiß. Praktisch gesehen sollten dies aber die Zeichen sein, die nur in Frage kommen können. Ich dachte nur es geht ewas kürzer (gehts vermutlich auch...)
Mit freundlichem Gruß
Micha
Hi,
Das habe ich natürlich erfolglos versucht, wie Du Dir denken kannst, wobei ich es so interpretiert habe:
s.replaceAll("/<par>.*</par>/s", "");
Java ist nicht PHP. Die / haben in einem Java-Regex die Bedeutung / - sie sind keine Begrenzer für den Regex.
Um Flags anzugeben gibt es zwei Möglichkeiten: Die Verwendung von java.util.regex.Pattern (in Kombination mit java.util.regex.Matcher, der das replaceAll macht), oder aber die Verwendung des Konstrukts
(?idmsux-idmsux) Nothing, but turns match flags i d m s u x on - off
innerhalb des regulären Ausdrucks, wenn es unbedingt die String-Methode replaceAll sein muß.
(wird derselbe Regex mehrfach verwendet, ist die Verwendung von Pattern zu empfehlen, da hier der Ausdruck nur einmal kompiliert werden muß).
cu,
Andreas
Hallo MudGuard,
vielen Dank für den Hinweis! Ich schaus mir mal an.
Mit freundlichem Gruß
Micha