Peter: Perl Regex Frage

Hallo,

ich bin aktuell mit meinem Latein am Ende und nach der Lösung zu googlen ist auch nicht so einfach möglich, da man das Problem schlecht in Worte fassen kann. Daher melde mich hier mit der Hoffnung, dass mir jemand bei meinem Problem helfen kann.

Ich suche einen regulären Ausdruck, mit welchem ich Variablennamen aus einem String extrahieren kann. Wenn ich einen Variablennamen auf Plausibilität prüfe, dann funktioniert der Ausdruck, da ich den Variablennamen vom Anfang bis zum Ende prüfe, also mit /^...$/. Der Ausdruck funktioniert jedoch nicht wenn ich eine Variable aus einer Zeichenkette extrahieren möchte.

Regex zum extrahieren von Variablen (vereinfacht)

\$[a-z]+(\.[a-z]+)*(\.set\(\))?
Zeichenketten mit zu extrahierenden Variablen

<§if $a !=>
<§if $a.b !=>
<§if $a.b.set() !=>
<§if $a.b.c !=>
<§if $a.b.c.set() !=>
Beispiel

<§if $a.b.c.set() !=>
Anstatt $a.b.c.set() wird $a.b.c.set extrahiert.

Mir ist die Problematik bekannt, wobei ich dies - wie bereits erwähnt - schlecht in Worte fassen kann. Die Variable passt beim Extrahieren bereits auf folgenden Teilausdruck $[a-z]+(.[a-z]+)* <--(.set())?, da ich beim Extrahieren nicht wie beim Prüfen von Anfang bis zum Ende prüfen kann. Daher erhalte ich eben als Ergebnis $a.b.c.set und nicht wie gewünscht $a.b.c.set().

Ich hoffe ich konnte einigermaßen erklären was ich meine und wäre für eine Lösung sehr dankbar.

Mit freundlichen Grüßen

Peter

  1. Hallo Peter,

    ich habe 0 Ahnung von Perl, aber mein Kollege der liebt/lebt Perl. Er ist immer im IRC https://www.perl.org/community.html zu erreichen (DEhansWURST)

  2. Hi,

    Regex zum extrahieren von Variablen (vereinfacht)
    
    \$[a-z]+(\.[a-z]+)*(\.set\(\))?
    

    in der ersten runden Klammer willst Du nicht .set() erlauben. Also füge einen negative lookahead ein:

    \$[a-z]+((?!\.set\(\))\.[a-z]+)*(\.set\(\))?
    

    trifft alle Deine Strings so wie gewünscht. Und versagt auch nicht bei sowas:

    <§if $a.set.c.set() != 0§>
    <§if $a.setzdichhin.c.set() != 0§>
    <§if $a.trendsetter.c.set() != 0§>
    

    ist allerdings - um Gunnars Anmerkung zuvorzukommen - kein regulärer Ausdruck mehr, nur noch ein Such-Muster.

    cu,
    Andreas a/k/a MudGuard

    1. @@MudGuard

      ist allerdings - um Gunnars Anmerkung zuvorzukommen - kein regulärer Ausdruck mehr, nur noch ein Such-Muster.

      Wobei ich da nicht unbedingt „nur noch“ sagen würde. Ja nach Betrachtungsweise kann man sogar von „sogar“ sprechen. ;-)

      LLAP 🖖

      --
      “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
    2. Hallo,

      genau so geht es. Ich habe es auch mit einem negativen Lookahead probiert, jedoch hatte ich einen Denkfehler drin und daher hat es bei nicht ganz funktioniert. Auf jeden Fall geht es mit deinem Vorschlag. Also danke dir für die schnelle Lösung und allen die sich Gedanken gemacht haben.

      Mit freundlichen Grüßen

      Peter