Reguläre Ausdrücke im PowerBuilder

PowerBuilder Objekt

In einem älteren Beitrag habe ich hier einmal beschrieben, wie ich meine Archivierung teilweise automatisiert habe. In dem Artikel ging es im Wesentlichen darum, wie Dokumente verschlagwortet werden und sinnvolle Dateinamen bekommen. Der Ablauf OCR über die Dokumente, erkannten Text extrahieren, dann Meta-Daten schreiben und Datei umbenennen habe ich mit Autohotkey realisiert. Doch stieß ich hier schnell an Grenzen, zumindest bei dem Ansinnen, es auch alles etwas ergonomisch und nett für den Anwender zu machen. Da blieb dann für mich „nur“ noch der PowerBuilder von Sybase bzw. SAP und ich habe das Projekt im Prinzip von vorne begonnen.

Doch schnell stieß ich auf ein wesentliches Problem. Der extrahierte Text muss nach Datum, Belegnummer, Absender oder Kontonummer, Auszugnummer etc. durchsucht und die gefunden Werte in die Datenbank eingetragen werden. Bisher habe ich schlicht die Zeichenketten vor und die Zeichenketten nach einem Wert gesucht. Alles dazwischen entsprach bspw. einem Datum. Funktioniert prima, wenn es feste Werte sind. Steht vor einem Datum zum Beispiel eine Belegnummer, so ist diese natürlich nie gleich. Hier muss ich nach Zahlen suchen. Das geht mit den im PowerBuilder gebotenen Funktionen nicht so einfach. Denn es geht eigentlich nicht mehr ohne Reguläre Ausdrücke. Die Funktion Match() kann diese zwar grundsätzlich, doch liefert sie nur ein „gefunden oder nicht gefunden“ zurück. Ich benötige aber den Wert.

Nun hätte ich das auch auf Datenbankebene machen können. Mit REGEXP_SUBSTR sind RegEx im SQL möglich. Doch auch hier habe ich das Problem, dass ich zwar gemäß Muster was finde, aber ich will nicht das Suchergebnis, sondern einen bestimmten Teil dieses Ergebnisses. Und hier kommt nun unvo_regexp ins Spiel. Es ist ein natives userobject welches vbscript.regex OLE object (Author: Nicolas Georges) einbindet. Es kann hier heruntergeladen werden.

Nachdem man unvo_regexp.sru importiert hat, steht einem ein kleines Objekt mit den nötigen Methoden zur Verfügung.

Wenn man sich diese ein wenig ansieht, ist es nahezu selbsterklärend. In meinem Fall war hier insbesondere die Methode group() von entscheidender Bedeutung. Ich kann nun direkt auf den gewünschten Wert zugreifen, auch wenn mein Suchergebnis zum Erlangen eines präzisen Fundortes recht groß ist. Die richtige Klammer gesetzt und mit rx.group(matchindes,groupindex) direkt zugreifen.

Zum Abschluss ein kleines Code-Beispiel, mit dem ich das Objekt getestet habe. Aus der Zeichenkette, die in einer PDF natürlich noch viel mehr Text davor un dahinter hat, soll das Belegdatum herausgelöst werden:

text_ges = '01661978 20.10.2016 4597'
unvo_regexp rx
rx = create unvo_regexp
rx.initialize( "\d{8}.(([0-2][0-9]|30|31)\.(0[1-9]|1[0-2])\.[0-9]{4}).\d{4}" /*as_pattern*/, true/*ab_globalscope*/, true/*ab_casesensitive */)
ll_match_count = rx.search( text_ges )

gc = rx.groupcount(1) // Anzahl Gruppen 
gs = rx.group(1,1) // Erste Gruppe aus erstem Suchergebnis, hier das Datum.

In meinem Regeleditor für meine Archivierung kann ich nun einen regulären Ausdruck für jeden Wert eintragen. Mit diesem finde ich nahezu alles. Ich muss jedoch zugeben, für den Anwender ist das schon hartes Brot. Aber mit diesem RedEx Editor hat man alle Chancen, einen guten Ausdruck erzeugen zu können.

Online RegEx Editor

Sollte das Thema interessant sein, Fragen aufkommen, ich freue mich über jeden Kommentar.

Reguläre Ausdrücke

Mit regulären Ausdrücken kann man in vielen Programmen sehr effektiv suchen. Auch in der Programmierung sind sie sehr nützlich, vor allem wenn man wie ich in Perl programmiert. Aber wenn man es nicht täglich macht, braucht man hin und wieder eine Auffrischung. Und wenn man es noch nie gemacht hat, kann ich diesen Artikel empfehlen. Als ich ihn gefunden hatte, musste ich mich natürlich über den Namen des Blogs amüsieren. Damit es da keinen Verdacht gibt: Das bin ich nicht. 😉

Übrigens kann man auch in OpenOffice.org mit regulären Ausdrücken suchen und in allen erwähnenswerten Editoren. Und nicht nur suchen, ebenso intelligent ersetzen. Die kryptische erscheinende Syntax schreckt ab, das gebe ich zu, aber eine Beschäftigung damit lohnt. Der genannte Artikel mach den Einstieg leichter.