Neben dem Auffinden von bestimmten Textpassagen ist das Extrahieren von Druckdaten eine der weiteren Aufgaben der regulären Ausdrücke in <strong>print<span style="color:red;">2</span>forms</strong>
. Dazu werden zu jedem regulären Ausdruck zehn Textpuffer zur Verfügung gestellt. Die Inhalte der Textpuffer werden durch die Klammerung innerhalb des Ausdrucks beschrieben. Ein Beispiel:
*(#+) +(#+) +(#+).*
Mit diesem Ausdruck werden drei beliebig große, durch Leerzeichen voneinander getrennte Zahlen erkannt. Im Ausdruck sind drei Klammernpaare rund um die Zahlen zu erkennen. Dabei entspricht jedem Klammerpaar genau ein Textpuffer.
Wird der Ausdruck auf den Text '123 456 789' angewendet, enthält also der erste Textpuffer die Zeichenkette '123', der zweite Textpuffer die '456' und der dritte Textpuffer die '789'. Auf diese Textpuffer kann dann innerhalb von Schablonen für Text-, Barcode- oder Ressourcefelder mit '\1', '\2' und '\3' Bezug genommen werden.
Textpuffer und damit auch die Klammern können sich überlappen. Ein weiteres Beispiel:
*(#{1,3}(\.###)*,##) €
Hier soll ein Geldbetrag mit Tausendertrennung erkannt werden. Angewendet auf den Text ' 1.234.567,89 €' wird der erste Textpuffer die Zeichenkette '1.234.567,89' beinhalten, und der zweite Textpuffer die Zeichenkette '567'. Der reguläre Ausdruck zeigt nicht nur überlappende Klammern und Puffer, sondern auch den Fall, daß ein Puffer aufgrund eines Quantors wiederholt gefüllt wird. In diesen Fällen ist immer nur das zuletzt erkannte Textstück abgespeichert.
Die Puffer werden also mit jeder öffnenden Klammer durchgezählt. Es ist demnach klar, daß ein gültiger Ausdruck in <strong>print<span style="color:red;">2</span>forms</strong>
nicht mehr als zehn Klammerpaare haben darf. Es gibt allerdings eine Ausnahme, und die hängt mit der Zählweise der Paare zusammen.
Im Gegensatz zu vielen anderen Dialekten zählt <strong>print<span style="color:red;">2</span>forms</strong>
die Klammern nicht statisch, sondern dynamisch. Ein zugegeben etwas gekünsteltes Beispiel soll den Unterschied klar machen:
((a)b|(b)c)
Statisch gesehen enthält dieser Ausdruck drei öffnende Klammern, sodaß auch drei Puffer angelegt und gefüllt werden. Wegen der Alternative ist aber immer nur einer der Puffer zwei oder drei gefüllt.
In <strong>print<span style="color:red;">2</span>forms</strong>
werden dagegen nur zwei Puffer angelegt, weil ja wegen der Alternative auch nur zwei gebraucht werden. Man findet daher im zweiten Puffer immer das Ergebnis der Alternative, also 'a' oder 'b', und muß beim Zusammenstellen einer Schablone im Text- oder Barcodefeld nicht die beiden Alternativen unterscheiden. Das macht das Handling der Schablonen bedeutend einfacher.
Allerdings hat die dynamische Zählweise einen Fallstrick. Als Beispiel dafür der nachfolgende Ausdruck:
((a)(b)|(b)c)(d)
Hier ist im einen Fall der Alternative das 'd' im dritten und im anderen Fall im vierten Puffer zu finden. So etwas muss natürlich vermieden werden, was durch Einfügen eines leeren Klammerpaars schnell erledigt ist:
((a)(b)|()(b)c)(d) oder
((a)(b)|(b)()c)(d) oder
((a)(b)|(b)c())(d)