adelho: Hilfe bei regulärem Ausdruck

Hallo Forum,

ich brauche Hilfe bei einem regulären Ausdruck.

Ich habe folgende Textzeile:

Title = "Stickkarte "Embroider your Holiday""

und folgenden regulären Ausdruck dazu verfasst:

^\s*([^[\s]+)\s*=[\s"]*(.*)("*)$

Ich möchte den Wert vor dem Istgleich als Schlüssel für ein Array verwenden und den String dahinter als Wert. Da der Teil hinter dem Istgleich in Anführungszeichen oder auch ohne notiert sein kann, ist es recht schwierig.
Das Anführungszeichen direkt nach dem Istgleich ist leicht zu erfassen, aber das am Ende bekomme ich nicht weg, weil der Ausdruck (.*) an Stelle 25 es immer mit nimmt. Ein Ausschluss mit [^"]* ist nicht möglich, weil innerhalb des Strings ja auch escapete Anführungszeichen vorkommen können.

Weiß jemand Rat?

Vielen Dank für die Hilfe.

  1. Hallo,

    da du vermutlich zeilenweise arbeitest, kannst du auch einfach folgendes machen:

    ^(\w+)\s+=\s+"?(.+?)"?$

    Also mit ^ und $ für Stringanfang und -ende arbeiten, mit optionalen " sowie mit einem »ungreedy« .+?, das nur bis zum letzten optionalen " reicht.

    Mathias

    1. Hihö,

      ^(\w+)\s+=\s+"?(.+?)"?$

      müsste klappen, allerding sind Fälle wie
      a = "bla
      oder
      a = bla"
      nicht anständig abgedeckt...
      Ich würde evtl mit nem doppelten Regex arbeiten, also z.B.
      (^(\w+)\s+=\s+(.+?)$) | (^(\w+)\s+=\s+"(.+?)"$)

      Gruß!

      1. Hallo,

        ^(\w+)\s+=\s+"?(.+?)"?$
        müsste klappen, allerding sind Fälle wie
        a = "bla
        oder
        a = bla"
        nicht anständig abgedeckt...

        Ja, wobei »anständig« zu definieren wäre. Die Frage ist, ob diese Fälle gültige Eingabewerte sind und welches Verhalten gewünscht ist: Sollen die " als verunglückte Delimiter oder als Teil des Wertes gesehen werden? Obige RegExp ignoriert sämtliche " an Anfang und Ende des Wertes. Je nach Konvention kann das problematisch sein oder in Ordnung.

        Ich würde evtl mit nem doppelten Regex arbeiten, also z.B.
        (^(\w+)\s+=\s+(.+?)$) | (^(\w+)\s+=\s+"(.+?)"$)

        Das Problem davon ist, dass die erste Ausdruck immer matchen würde und die Delimiter als Teil des Wertes parsen würde. Man müsste also mit der letzten anfangen (wobei wir schon fast bei einem richtigen Parser wären, RegExps sind dafür immer nur bedingt geeignet).

        Mathias

  2. Servus,

    ich brauche Hilfe bei einem regulären Ausdruck.

    So weit man aus deinem Beispiel schließen kann, suchst du eigentlich keinen regulären Ausdruck, sondern eine Methode, einen String an einem vorgegeben Zeichen zu teilen (Stichwort: split) und evtl. Leerzeichen am Anfang und Ende zu entfernen (trim).

    Einen regulären Ausdruck sollte man aus Performancegründen und zur besseren Lesbarkeit nur dann verwenden, wenn es anders nicht geht.