Beispiele zum Aufbrechen von Schleifen

(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)

Wir wissen jetzt im Prinzip, wie das Rezept zum Aufbrechen der Schleife funktioniert, und wenden es auf einige Beispiele aus früheren Kapiteln an.

»Mehrbuchstabige« Anführungszeichen

Aus Wie Regex-Maschinen arbeiten (siehe unter Nicht-gierige Quantoren) stammt das folgende Beispiel mit HTML-Tags:

<B>                # Passt auf das <B> am Anfang ...
(                  #     So viele vom Folgenden wie nötig ...
  (?!  </?B>  )    #        Wenn wir weder <B> noch </B> haben ...
  .                #             ... ist jedes Zeichen recht.
)*                 #
</B>               # ... bis das schließende Begrenzungszeichen passen kann.

Mit ˹[^<]˼ als normalem Teil und ˹(?!</?B>)<˼ als speziellem erhalten wir die aufgebrochene Version:

<B>                # Passt auf das <B> am Anfang ...
  (?> [^<]* )      # »Normal« finden ...
  (?>              # So viele vom Folgenden wie nötig ...
     (?! </?B> )   #     Wenn wir weder <B> noch </B> haben ...
     <             #     Einmal »speziell« ...
     [^<]*         #     ... und eine beliebige Anzahl von »normal«
   )*              #
</B>               # ... bis zum schließenden Begrenzungszeichen.

Die atomaren Gruppen sind hier nicht nötig, die Regex wird aber dadurch bei einem Teil-Treffer schneller.

Aufbrechen der Schleife bei Fortsetzungszeilen

Bei dem Beispiel mit den Fortsetzungszeilen aus Regex-Methoden aus der Praxis (siehe unter Fortsetzungszeilen) waren wir zum Ausdruck ˹^\w+=([^\n\\]|\\.)*˼ gelangt. Das ist natürlich ein sehr guter Kandidat für unser Rezept:

^ \w+ =                 # Schlüssel und Gleichheitszeichen.
# Nun wird der Wert erkannt und abgespeichert ...
(
   (?> [^\n\\]* )       # »normal«*
   (?> \\. [^\n\\]* )*  # ( »speziell« »normal«* )*
)

Auch bei diesem Beispiel sind die atomaren Gruppen für die Funktion der Regex unerheblich, aber mit diesen Klammern findet die Maschine einen Fehlschlag schneller.

Aufbrechen der Schleife bei CSV-Daten

Unter Regex-Methoden aus der Praxis wurde die Verarbeitung von CSV-Daten an einem längeren Beispiel behandelt und ergab bei Das Getriebe ausschalten dieses Resultat:

(?:^|,)
(?:                             # Entweder ein Feld in Anführungszeichen ...
      "                         #       Öffnendes Anführungszeichen
        ( (?: [^"] | "" )* )    #         Anführungszeichen nur verdoppelt erlaubt
      "                         #       Schließendes Anführungszeichen
   |                            # ... oder ...
      ( [^",]+ )                # ... ein ›nacktes‹ Feld ohne Kommas und Anführungszeichen.
)

Im Weiteren hatten wir mit dem Anker ˹\G˼ verhindert, dass das Getriebe diese Regex an einer ungeeigneten Position ansetzt. Jetzt wissen wir, wie eine Schleife dieser Art aufgebrochen wird, und wollen sehen, ob diese Technik auch hier angewendet werden kann.

Der Teil, der ein String-Feld nach Microsoft-Konvention erkennt, ˹(?:[^"]|"")*˼, sieht vielversprechend aus. Eigentlich ist die Regex schon so angeordnet, dass sich die Teile normal und speziell fast von selbst ergeben: ˹[^"]˼ und ˹""˼.

Hier sind diese Teile im ursprünglichen Perl-Programm eingesetzt:

while ($zeile =~ m{
          \G(?:^|,)
          (?:               # Entweder ein Feld in Anführungszeichen (mit "" für jedes ") ...
             "              # Öffnendes Anführungszeichen
              ( (?> [^"]* ) (?> "" [^"]* )*  )
             "              # Schließendes Anführungszeichen
           |                # ... oder ...
             ( [^",]* )     # ... ein ›nacktes‹ Feld ohne Kommas und Anführungszeichen.
          )
      }gx)
{
   if (defined $2) {
       $feld = $2;
   } else {
       $feld = $1;
       $feld =~ s/""/"/g;
   }
   print "[$feld]";         # Feld für Debugging-Zwecke ausgeben.
     .                      # Wert in $feld kann jetzt weiterverarbeitet werden.
     . 
     .                       
}

Auch hier sind die atomaren Gruppen für die Funktion des Programms unwesentlich, sie machen die Regex aber effizienter.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:
   

Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln