Reguläre Ausdrücke in Java: Extrem nützlich (Java-Regex)
Ich hatte neulich in einem Projekt zur automatischen Rechnungserkennung (OCR) die Anforderung, dass Texte (Artikelnummern) in Abhängigkeit vom Lieferanten nach Musterzeichenfolgen durchsucht werden sollten und dann mit den erkannten Mustern verschiedene Dinge passieren sollten: Zeichen(ketten) entfernen, abändern oder hinzufügen. Das ganze sollte über ein Benutzerinterface konfigurierter und maximal variabel sein.
Die einfachste und wirklich sehr elegante Lösung bestand in der Schaffung einer entsprechenden Tabelle mit den Stammdaten:
- Lieferantennummer
- Artikelnummer
- Muster-Zeichenfolge
- Erstetzungszeichenfolge
- …
Anschließend habe ich dann einen kleinen Eingriff nach der OCR-Erkennung mit den zu verarbeitenden Zeichenketten vorgenommen. Der Programmieraufwand war an dieser Stelle unter Verwendung der Regulären Ausdrücke in Java (Regex) minimal.
Hier dazu ein Codebeispiel:
import java.util.regex.*; public class RegexTester { public static void main(String args[]) { String sourceString = "12345X67890A12XB123X12"; String patternString = "([0-9])([0-9])([0-9])X"; String replacementString = "$2$3X"; Matcher matcher = Pattern.compile(patternString).matcher(sourceString); StringBuffer targetString = new StringBuffer(); while (matcher.find()) matcher.appendReplacement(targetString, replacementString); matcher.appendTail(targetString); System.out.println(targetString); } }
In diesem kleinen Beispiel wird im Quellstring “12345X67890A12XB123X12″ nach denjenigen Stellen gesucht, in denen ein X auf 3 Ziffern folgt. Dieses Suchmuster wird dabei durch diesen Regulären Ausdruck definiert: “([0-9])([0-9])([0-9])X”. Wenn so eine Stelle gefunden wird soll die erste der 3 Ziffern eliminiert werden. Die beiden Folgeziffern und das X sollen hingegen im Ergebnis erhalten bleiben. Diese Vorschrift wird durch diesen Regulären Ausdruck definiert: “$2$3X”.
Die kleine Routine gibt dann das Ergebnis folgerichtig in Zeile 12 aus: “1245X67890A12XB23X12″
Ich bin begeistert, wie leistungsfähig die Regulären Ausdrücke sind und wie leicht die Implementierung in Java zu machen ist.