Micha: replaceAll und RegExp

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

--
simple JavaScript Spiele: Snake, MineSweeper, Sudoku oder Tetris
  1. 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

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. 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

      --
      simple JavaScript Spiele: Snake, MineSweeper, Sudoku oder Tetris
      1. Hi,

        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?

        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

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. 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

          --
          simple JavaScript Spiele: Snake, MineSweeper, Sudoku oder Tetris
    2. Hallo Cheatah,

      habs jetzt mit s = s.replaceAll("<par>[\\w.</>\\s]*</par>", ""); hinbekommen.

      Mit freundlichem Gruß
      Micha

      --
      simple JavaScript Spiele: Snake, MineSweeper, Sudoku oder Tetris
      1. 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

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. 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

          --
          simple JavaScript Spiele: Snake, MineSweeper, Sudoku oder Tetris
          1. 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

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
            1. Hallo MudGuard,

              vielen Dank für den Hinweis! Ich schaus mir mal an.

              Mit freundlichem Gruß
              Micha

              --
              simple JavaScript Spiele: Snake, MineSweeper, Sudoku oder Tetris