Verfasst von: bletra | 15. November 2009

Lesbare reguläre Ausdrücke

Ob bei der Formularvalidierung, dem Rausfiltern ungewünschter Zeichen oder Filtern gewünschter Information, reguläre Ausdrücke werden vielfältig eingesetzt. Letztens wollte ich einen regulären Ausdruck für eine E-Mail finden. Fündig wurde ich schnell bei http://www.regular-expressions.info Intuitiv verstanden habe ich ihn nicht. Martin Fowler hat einen Artikel geschrieben, wie man auch reguläre Ausrdrücke im Code dokumentieren kann und Teile besser wieder verwenden kann. Im Folgenden gebe ich das Beispiel seines Artikels wieder.

Gegeben ist der reguläre Ausdruck:

const string pattern =  @"^score\s+(\d+)\s+for\s+(\d+)\s+nights?\s+at\s+(.*)";

Idee: Zerlege den regulären Ausdruck in sinnvolle Einzelteile, z.B.

const string scoreKeyword = @"^score\s+";
const string numberOfPoints = @"(\d+)";
const string forKeyword = @"\s+for\s+";
const string numberOfNights = @"(\d+)";
const string nightsAtKeyword = @"\s+nights?\s+at\s+";
const string hotelName = @"(.*)";
const string pattern =  scoreKeyword + numberOfPoints + forKeyword + numberOfNights + nightsAtKeyword + hotelName;

Alternativ kann man sich an den Leerzeichen orientieren und davon getrennte Tokens definieren:

private String composePattern(params String[] arg) {
      return "^" + String.Join(@"\s+", arg);
    }
const string numberOfPoints = @"(\d+)";
const string numberOfNights = @"(\d+)";
const string hotelName = @"(.*)";

const string pattern =  composePattern("score", numberOfPoints, "for", numberOfNights, "nights?", "at", hotelName);

Meiner Meinung nach, könnte man auch numberOfPoints und numberOfNights als numberOf zusammenfassen.
Insgesamt überzeugen mich beide Ansätze. Bei vielen Leerräumen, bzw. sinnvollen Einheiten zwischen den Leerräumen, favorisiere ich den zweiten Ansatz.

Im Artikel wurde in Kommentaren noch angemerkt, dass man beim Zerlegen mit öffnenden und schließenden Klammern aufpassen muss – aber ob das nun in einem großen regulären Ausdruck übersichtlicher ist? Das Gesamtpattern kann ich mir ja jederzeit mit einer entsprechenden Print-Anweisung ausgeben lassen.

Advertisements

Responses

  1. Die Idee ist so simpel, man kommt gar nicht selbst darauf. Das sollte auf jeden Fall Code lesbarer und, falls etwas geändert werden soll, wartbarer machen. Vielen Dank für die Idee!

    Man müsste jetzt prüfen, ob die Idee in http://regextester.net/live-javascript-regex-tester.php einbaubar ist, dann würde der Tester noch komfortabler.


Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Kategorien

%d Bloggern gefällt das: