FYI: Reguläre Ausdrücke nutzen ja/nein

Ich möchte an dieser Stelle ein kurzes, kleines Post bezüglich der Verwendung von Regulären Ausdrücken machen. Hintergrund ist, dass es Leute gibt, die von diesen abraten, oft mit dem Argument, dass diese eine zu hohe Last auf der CPU verursachen würden.

Als erstes ist da natürlich die Frage: Entsteht da tatsächlich eine hohe Last?
Ja, da entsteht eine relativ hohe Last. Aber dies ist kein Argument gegen etwas. Eine Last entsteht oft. Wenn wir ein Array sortieren, entsteht eine Last. Wenn wir 3D Dinge berechnen ebenso. Aber was ist denn die Alternative? Soll man jetzt nichts mehr sortieren oder kein 3D mehr verwenden? Wir haben leistungsfähige Systeme und diese nutzen wir als Entwickler natürlich.

Aber selbstverständlich nutzen wir unseren gesunden Menschenverstand:
a) wenn es einfache Operationen gibt, die die Prüfung schon machen können, dann nutze ich diese (Also z.B. die Methoden der String Klasse, die keine regulären Ausdrücke nutzen).
b) wenn es geeignetere Mittel gibt, dann sollte man diese auch einsetzen. Typische Beispiele sind z.B. XML oder HTML auszuwerten.

So gibt es klare Vorteile:
- Oft sind reguläre Ausdrücke (mit entsprechender Erfahrung) schnell und einfach zu schreiben.
- Es gibt viele Beispiele, die oft 1:1 verwendbar sind
- Es gibt viele Tools rund um reguläre Ausdrücke (z.B. zum einfachen austesten)
- Oft wird die massive Erstellung von Objekten vermieden, was eine Last beim Garbage Collector verursacht.

Ein Nachteil, der auch von Zeit zu Zeit zu hören ist: Reguläre Ausdrücke sind schwer lesbar. Ja, die sind kryptisch und sehr überladen und stehen keiner natürlichen Sprache nahe. Daher sind diese nicht intuitiv verständlich. Aber dies bedeutet nur, dass diese erlernt werden müssen. Da unterscheiden diese sich nicht von z.B. Java oder C/C++.

Ein wichtiger Punkt ist dann natürlich noch zu beleuchten: Ist es "production ready", sprich: Ist es stabil genug, um verwendet werden zu können?
Hier sind aus meiner Sicht zwei Punkte interessant:
a) Testbarkeit: Ich wähle eine Implementierung (einfach, da Bestandteil des JDKs) und teste die Fälle, die vorkommen werden. Dadurch habe ich eine Kontrolle - so wie ich diese bei eigenem Code auch hätte.
b) Die Technologie ist nicht neu und hat sich bewährt. So ist sie schon in vielen JDK Versionen enthalten. Desweiteren haben reguläre Ausdrücke in viele Technologien Einzug gehalten. Exemplarisch nenne ich einfach einmal XSLT 2. Und die Technologie findet sich in allen bekannten Sprachen / Umgebungen (z.B. .Net).

Referenzen:
a) Stack Overflow hat einige Threads zu diesen Themen, z.B. https://stackoverflow.com/questions/998997/should-i-avoid-regular-expressions
b) Es wird teilweise in Büchern erwähnt. Z.B. Effective Java 3rd Edition von Joshua Bloch verweist in Item 9 explizit darauf, dass die Erzeugung von unnötigen String Objekten oft durch reguläre Ausdrücke vermieden werden kann.

Sollte ich Argumente für oder gegen Reguläre Ausdrücke vergessen haben, so können diese gerne ergänzt werden. Aber bitte auf andere Dinge verzichten um den Moderatoren nicht unnötig Arbeit zu machen. (Und diese können den Thread evtl. auch später schließen so keinem etwas wichtiges einfällt. Und ggf. können die Moderatoren dann auch Threads zusammen führen....)
 
Ich will noch ein paar Punkte ergänzen. Ich selber bewege mich bei Java im Umfeld von Enterprise Anwendungen in größeren Landschaften.

Die "Last" die die Auswertung von regulären Ausdrücken verursacht, ist normalerweise im Verhältnis zu dem, was das Programm sonst tut (Umsysteme über Schnittstelle abzufragen z.B.) gering.

Wenn man reguläre Ausdrücke hat, die wirklich messbare Last verursachen, liegt meines Erachtens die Ursache oft woanders. Dann sind reguläre Ausdrücke an der Stelle nicht das richtige Tool, aber das Problem ist dann die komplexe Datenstruktur. Das sind dann aber auch reguläre Ausdrücke, die meist nicht mehr verständlich sind, weil sie so lang sind - egal ob man sie lesen kann oder nicht.

Zusammengefasst:
* Last ist bei regulären Ausdrücken, die noch handlebar sind im Verhältnis zu dem was die Anwendung sonst tut eigentlich kein Problem
* Bei regulären Ausdrücke die nicht mehr nachvollziehbar sind aufgrund ihres Umfangs und Komplexität ist die Last das nachrangige Problem - hier sollte man eher Lösungen suchen die Daten sinnvoller zu handeln.
 
Wichtig ist auf jeden Fall sich die "vorcompilierten" Pattern-Objekte zu merken. Oftmals werden Fassaden wie String#matches, String#split oder Pattern#matches eingesetzt, das ist natürlich nicht optimal. Wenn der Automat einmal übersetzt ist, sehe ich keine echten Probleme. Man sollte sich ja die Alternative anschauen: Ketten von indexOf/substring ...

Als weitere Optimierung bei Regex kann man zum Beispiel die Greedy-Operatoren + * in der Regel durch lazy-Varianten +? und *? ersetzen.

Regex sind für mich viel mehr als nur match(...), mit Regex kann man:
  • Matchen auf komplette Übereinstimmung
  • Finden von allen Stellen
  • Suchen und Ersetzen
  • Splitten
Gerade das Suchen und Ersetzen ist super, darauf möchte ich nicht verzichten.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben