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

K

kneitzel

Gast
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....)
 

LimDul

Top Contributor
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.
 

Ullenboom

Bekanntes Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Reguläre Ausdrücke Java Basics - Anfänger-Themen 1
W Reguläre Ausdrücke Java Basics - Anfänger-Themen 1
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
B Reguläre Ausdrücke Java Basics - Anfänger-Themen 2
P Reguläre Ausdrücke und Korrektheit Java Basics - Anfänger-Themen 2
0 Reguläre Ausdrücke bzw. Zahlenformat im String Java Basics - Anfänger-Themen 7
G Reguläre Ausdrücke Zeichenketten Java Basics - Anfänger-Themen 12
C Klassen Reguläre Ausdrücke auf Gleichheit prüfen Java Basics - Anfänger-Themen 5
J Reguläre Ausdrücke Java Basics - Anfänger-Themen 3
C Reguläre-Ausdrücke Java Basics - Anfänger-Themen 5
J reguläre Ausdrücke Java Basics - Anfänger-Themen 1
B Reguläre Ausdrücke Java Basics - Anfänger-Themen 3
B Java - Reguläre Ausdrücke - RegEx oder Regular Expressions - Eckige Klammern Java Basics - Anfänger-Themen 2
H Erste Schritte Von jpg zu jpeg // reguläre Ausdrücke Java Basics - Anfänger-Themen 3
K Reguläre Ausdrücke Java Basics - Anfänger-Themen 3
K Reguläre Ausdrücke Java Basics - Anfänger-Themen 6
B Reguläre Ausdrücke Java Basics - Anfänger-Themen 5
K Reguläre Ausdrücke Java Basics - Anfänger-Themen 5
C Reguläre Ausdrücke: string.matches() und gefangene Gruppen Java Basics - Anfänger-Themen 12
S Reguläre Ausdrücke richtig einsetzten Java Basics - Anfänger-Themen 5
T Reguläre Ausdrücke Java Basics - Anfänger-Themen 18
0 Reguläre Ausdrücke und Funktionen Java Basics - Anfänger-Themen 2
D Reguläre Ausdrücke Java Basics - Anfänger-Themen 3
S Reguläre Ausdrücke Java Basics - Anfänger-Themen 16
A Reguläre Ausdrücke Frage Java Basics - Anfänger-Themen 3
E Reguläre Ausdrücke mit sehr variablen Eigenschaften Java Basics - Anfänger-Themen 2
N Reguläre Ausdrücke - bekomme Suchkriterium nicht hin Java Basics - Anfänger-Themen 3
J Reguläre Ausdrücke in Java Java Basics - Anfänger-Themen 2
J Reguläre Ausdrücke Java Basics - Anfänger-Themen 6
S Strings und reguläre Ausdrücke Java Basics - Anfänger-Themen 2
N Reguläre Ausdrücke Java Basics - Anfänger-Themen 4
S Reguläre Ausdrücke Java Basics - Anfänger-Themen 2
M Reguläre ausdrücke? Java Basics - Anfänger-Themen 8
D Reguläre Ausdrücke: Anzahl Wiederholungen als Variable? Java Basics - Anfänger-Themen 3
A Reguläre Ausdrücke Java Basics - Anfänger-Themen 2
M Reguläre Ausdrücke - maskieren von Zeichen? Java Basics - Anfänger-Themen 9
M Reguläre Ausdrücke und Ausgabe Java Basics - Anfänger-Themen 10
K Reguläre Ausdrücke - Gefundene Tokens direkt ermitteln Java Basics - Anfänger-Themen 3
J Reguläre Ausdrücke: Zeichenfolge ausschließen Java Basics - Anfänger-Themen 2
G Reguläre Ausdrücke Java Basics - Anfänger-Themen 13
L java und reguläre ausdrücke Java Basics - Anfänger-Themen 4
G Reguläre Ausdrücke zum Filtern von logfiles Java Basics - Anfänger-Themen 2
T Reguläre Ausdrücke? Java Basics - Anfänger-Themen 3
E Reguläre Ausdrücke Java Basics - Anfänger-Themen 17
O reguläre Ausdrücke bei java.util.regex.Pattern Java Basics - Anfänger-Themen 4
A Reguläre Ausdrücke der Pfade unter Windows und Unix Java Basics - Anfänger-Themen 3
N Reguläre Ausdrücke Java Basics - Anfänger-Themen 5
G Problem reguläre Ausdrücke Java Basics - Anfänger-Themen 4
A Reguläre Ausdrücke: Inhalt zwischen zwei Schlüsselwörtern Java Basics - Anfänger-Themen 2
A Reguläre Ausdrücke: Problem mit Backslash Java Basics - Anfänger-Themen 3
W Reguläre Ausdruck Java Basics - Anfänger-Themen 6
K Warum zeigt dieser reguläre Ausdruck true an? Java Basics - Anfänger-Themen 1
S reguläre Audrücke verbinden Java Basics - Anfänger-Themen 18
N reguläre ausdruech und exception Probleme Java Basics - Anfänger-Themen 7
R Reguläre Ausdruck definieren Java Basics - Anfänger-Themen 3
S Prüfungsvorbereitung Januar ( Thema Ausdrücke ) Java Basics - Anfänger-Themen 14
B Regex Ausdrücke für Monate Java Basics - Anfänger-Themen 7
C Boolsche Ausdrücke Java Basics - Anfänger-Themen 3
A Schleifen und Boolsche Ausdrücke Java Basics - Anfänger-Themen 42
G Java Lambda Ausdrücke Java Basics - Anfänger-Themen 19
A Lambda-Ausdrücke Java Basics - Anfänger-Themen 6
G Lambda Ausdrücke Java Basics - Anfänger-Themen 2
O Lambda Ausdrücke in einem Comparator Java Basics - Anfänger-Themen 4
B Erste Schritte Boolesche Ausdrücke & Gesetze Java Basics - Anfänger-Themen 3
S Lambda Ausdrücke Streams Java Basics - Anfänger-Themen 6
D Variablen Ausdrücke Java Basics - Anfänger-Themen 6
M Lambda - Ausdrücke verstehen Java Basics - Anfänger-Themen 2
N Lambda Ausdrücke richtig schreiben Java Basics - Anfänger-Themen 4
F Methoden Lambda Ausdrücke Methodensignatur Java Basics - Anfänger-Themen 6
P Ausdrücke berechnen Java Basics - Anfänger-Themen 2
J Java 8 Lamda ausdrücke Java Basics - Anfänger-Themen 9
C Lambda Ausdrücke Java Basics - Anfänger-Themen 1
TheSorm Java 8 Lambda-Ausdrücke Java Basics - Anfänger-Themen 9
S Anweisungen Ausdrücke Java Basics - Anfänger-Themen 7
J Regex Ausdrücke im Array - Wieso werden sie nicht erkannt? Java Basics - Anfänger-Themen 4
K Ausdrücke auswerten Java Basics - Anfänger-Themen 8
C Boolsche Ausdrücke - Wo ist mein Fehler? Java Basics - Anfänger-Themen 14
M Boolsche Ausdrücke minimieren Java Basics - Anfänger-Themen 13
S arithmetische Ausdrücke prüfen Java Basics - Anfänger-Themen 11
S Datentypen Operatoren und Ausdrücke (formel richtig rechnen) Java Basics - Anfänger-Themen 8
T Ausdrucksparser für Mathematische Ausdrücke Java Basics - Anfänger-Themen 15
N Ausdrücke Java Basics - Anfänger-Themen 6
W Suche nach strings zwischen eckigen Klammern mittels regulärer Ausdrücke Java Basics - Anfänger-Themen 3
C arithmetische Ausdrücke Java Basics - Anfänger-Themen 7
M regüläre Ausdrücke, die String - Variablen und Expression Java Basics - Anfänger-Themen 5
M Ausdrücke -> Werte Java Basics - Anfänger-Themen 6
A mehrere Ausdrücke in for schleife vergleichen Java Basics - Anfänger-Themen 6
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
I Objekte in ShareProject speichern um später zu nutzen Java Basics - Anfänger-Themen 4
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
A Ein Array bearbeiten und in einer anderen Methode nutzen Java Basics - Anfänger-Themen 6
jamboy7 Java-API kennenlernen, verstehen und nutzen lernen Java Basics - Anfänger-Themen 4
K Zweimal dieselbe Methode als Übergabeparameter nutzen Java Basics - Anfänger-Themen 1
low_in_the_head Eigene Exception nutzen Java Basics - Anfänger-Themen 4
T Mathe Bibliotheksfunktionen nutzen bei Geany Java Basics - Anfänger-Themen 1
B Jsoup: gleiche Session nutzen Java Basics - Anfänger-Themen 0
G Scanner nutzen und Index auslesen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben