Was passiert, wenn Sie reguläre Ausdrücke kompilieren?

8

Wir alle wissen, dass Sie Ihre häufig verwendeten regulären Ausdrücke in etwas kombinieren können, das sehr gut funktioniert. Aber was ist diese Hexerei hinter den Vorhängen?

Ich nehme an, dass ein endlicher Automat dort gebaut wird, aber Sie müssen es besser wissen als ich.

    
progo 20.04.2011, 17:08
quelle

2 Antworten

5

Die Details der Kompilierung von regulären Ausdrücken variieren je nach Implementierung. Zum Beispiel die Kompilierung in Python oder re2 erstellt einfach eine Instanz eines regulären Ausdrucksobjekts. Die Zustandsmaschine dieses Objekts kann als Graph oder virtuelle Maschine modelliert werden. Ohne Kompilierung (Beispiel: RE.match(expression, input) ) wird jedes Mal, wenn match aufgerufen wird, ein neues Objekt für den regulären Ausdruck hinter den Kulissen erstellt. Dies ist überflüssig, wenn Sie einen Ausdruck mehr als einmal verwenden möchten.

In C # kann eines von drei Dinge passieren, wenn Sie kompilieren >:

  1. Ein reguläres Ausdrucksobjekt wird erstellt (als virtuelle Maschine implementiert), ähnlich wie Python und re2.
  2. Ein reguläres Ausdrucksobjekt wird erstellt, und die Opcodes seiner virtuellen Maschine werden in In-Memory-IL-Anweisungen on-the-fly kompiliert.
  3. Ein reguläres Ausdrucksobjekt wird erstellt, und die Opcodes seiner virtuellen Maschine werden als IL-Anweisungen auf den Datenträger kompiliert.

Sie erwähnen ein Interesse an Algorithmen. Werfen Sie einen Blick auf die ausgezeichneten Artikel von Russ Cox für zwei Ansätze:

Corbin March 20.04.2011, 19:21
quelle
1

Das Kompilieren eines regulären Ausdrucks ähnelt dem Kompilieren von Java- oder Python-Code. Der reguläre Ausdruck wird in eine Zwischendarstellung umgewandelt, die dann von der RE-Engine interpretiert wird, um die entsprechenden Operationen für eine Zeichenfolge auszuführen.

    
Ignacio Vazquez-Abrams 20.04.2011 17:22
quelle

Tags und Links