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