Marcel: Frage zu Regex

Hallo

Habe einen Text mit Tags:

[0=Titel]Hallo[1=Text]miteinander[/1=Text][2=Char]![/2=Char][/0=Titel]

Mit diesem Pattern

\[([0-9]+)\=.+?\].+?\[/\1\=.+?\]

Kann ich nun folgendes auslesen

[0=Titel]Hallo[1=Text]miteinander[/1=Text][2=Char]![/2=Char][/0=Titel]

Ziel wäre aber

[0=Titel]Hallo miteinander![/0=Titel]

zu erhalten, d.h. alle Tags innerhalb des äussersten Tags sollen entfernt werden. Mein Versuch war folgender:

[([0-9]+)=.+?][^[.*?]].*[^[/.*?]]*[/\1=.+?]

Das scheint aber nicht zu klappen, d.h. es gibt kein Match.

Kann mir jemand weiterhelfen?

Gruss Marcel

  1. Lieber Marcel,

    Du willst also alle "Tags", die keine Null am Anfang haben entfernen.

    Mein Versuch war folgender:

    [([0-9]+)=.+?][^[.*?]].*[^[/.*?]]*[/\1=.+?]

    Das kann ja nicht klappen. Warum sehen wir nun.

    Gesucht wird ein "Tag", von folgender Art: [x=abcdef] oder [/x=abcdef], wobei x eine Ziffer größer 0 sein soll.

    Das wollen wir mal als regulären Ausdruck formulieren:

    [/?[1-9]=[^]]+] (ungetestet!)

    Erklärung:

    • "eckige-Klammer-auf",
    • eventuell ein Slash,
    • eine beliebige Ziffer ungleich null, (setzt voraus, dass Deine Tags nur bis 9 nummeriert sind)
    • istgleich-Zeichen,
    • eine beliebig lange Kette von Zeichen ungleich "eckige-Klammer-zu",
    • "eckige-Klammer-zu".

    Klarer geworden?

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Hallo

      Vielen Dank für die Hilfe. Bin nun noch auf ein anderes Problem gestossen. Mehrstellige Ziffern habe ich so beschrieben:

      [0-9]+

      Wie kann ich nun z.B. die Zahl 64 ausschliessen?

      Irgendwie so? [0-9]+[^64]

      Gruss Marcel

      1. Lieber Marcel,

        Mehrstellige Ziffern habe ich so beschrieben:

        [0-9]+

        das ginge auch kürzer: \d+ ("\d" steht für "digit", was Ziffer bedeutet)

        Wie kann ich nun z.B. die Zahl 64 ausschliessen?

        Das wird sehr kompliziert. Da müsste man mit negative lookbehind arbeiten. Da habe ich weniger Übung drin...

        in etwa so: \d+(?<![64)

        Es ist auf jeden Fall empfehlenswert die eckige Klammer mit zu prüfen, damit man bezüglich der Mehrstelligkeit nur die gewollten Zahlen ausspart. Wenn ich  tiefer zu den Regexen nachlese, dann müsste man um das nullte Tag auszuschließen,

        folgendes notieren: \d+(?<![0)

        Bitte korrigiere mich jemand, wenn ich falsch liegen sollte!

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        1. Hallo

          folgendes notieren: \d+(?<![0)

          Habe das nun in deinen Vorschlag reingeschrieben. Das klappt auch, jedoch nur mit dem öffnenden Tag. Der schliessende Tag mit Nummer 0 wird trotzdem erkannt...

          [/?(\d+(?<![0))=[^]]+]

          Gruss Marcel

          1. Lieber Marcel,

            Der schliessende Tag mit Nummer 0 wird trotzdem erkannt...

            also _das_ hättest Du jetzt selbst gekonnt:

            [/?\d+(?<!/?[0)=[^]]+] (ungetestet!)

            Es könnte sein, dass sich der lookbehind an dem "eventuell" bezüglich des Slashes stört...

            Liebe Grüße aus Ellwangen,

            Felix Riesterer.

            1. Hallo

              [/?\d+(?<!/?[0)=[^]]+] (ungetestet!)

              Es könnte sein, dass sich der lookbehind an dem "eventuell" bezüglich des Slashes stört...

              Das ist vermutlich eben das Problem.

              "Lookbehind assertion is not fixed length"

              ?

              Gruss Marcel

              1. Lieber Marcel,

                [/?\d+(?<!/?[0)=[^]]+] (ungetestet!)
                "Lookbehind assertion is not fixed length"

                dann machen wir die assertion in ihrer Länge fix. Wir wollten ja das Zeichen vor der Zahl haben, um sicherzustellen, dass wir keine 10-er durchgehen lassen, wenn wir 0-er erlauben. Also nutzen wir doch die Character Class etwas schlauer!

                Wir hatten "(?<" als lookbehind, "!" für negativ und dann "/?" für eventuellen Slash (was in lookbehind/lookahead nicht geht, weil in der Länge variabel), was insgesamt "(?<!/?zahl) ergab. Es ist uns ja prinzipiell egal, welches Zeichen vor der Zahl steht (Slash oder eckige Klammer), solange wir die Zahl komplett haben. Das kann man auch als Character Class "[[/]" schreiben: Entweder Klammer oder Slash, aber eins von beiden muss es sein.

                Ergo neuer Versuch (für null): [/?\d+(?<![[/]0)=[^]]+] (wieder ungetestet!)

                Und? Zufriedenheit oder Fehlverhalten?

                Liebe Grüße aus Ellwangen,

                Felix Riesterer.

                1. Hallo Felix

                  Und? Zufriedenheit oder Fehlverhalten?

                  Vollste Zufriedenheit. Super. Vielen Dank!

                  Gruss Marcel