Warum sind reguläre Ausdrücke so krankhaft attraktiv?

23

Anhang 1 , Anhang 2 , ich glaube, Sie werden sich nicht schwer an andere Beispiele erinnern können.

Die Sache ist: Wenn es mehr als eine Möglichkeit gibt, ein Problem zu lösen, bittet der PHP-Programmierer (normalerweise durchsuche ich das PHP-Tag auf StackOverflow) um Hilfe bei der Lösung mit regulären Ausdrücken.

Selbst wenn es weniger wirtschaftlich sein wird, selbst wenn das PHP-Handbuch vorschlägt ( Link ), str_replaceanstelle eines preg_*oder einer ereg_*Funktion zu verwenden, wenn keine ausgefallenen Substitutionsregeln erforderlich sind.

Hat jemand eine Ahnung, warum das passiert?

Versteht mich nicht falsch, einige meiner besten Freunde sind reguläre Ausdrücke und ich verachte Perl nicht. Was ich nicht verstehe, ist, warum überhaupt nicht nach Alternativen gesucht wird, auch wenn der Overkill offensichtlich ist (regulärer Ausdruck zum Umschalten von Zeichenfolgen) oder die Codekomplexität exponentiell ansteigt (regulärer Ausdruck zum Abrufen von Daten aus HTML in PHP ).

cbrandolino
quelle
2
Vielleicht möchten Sie zitieren, was das PHP-Handbuch tatsächlich sagt.
ChrisF
1
Weil sie kryptisch sind, möchtest du also Teil des exklusiven Kewl Kidz Clubs sein? Und vor allem, weil sie eine kurze Möglichkeit bieten, ein Streichholz oder eine Extraktion auszudrücken, wofür sie gemacht sind. Sicher für Dummy-Fälle, benutzerdefiniertes Parsen, wenn es besser ist, aber die Entwicklungszeit beim Schreiben eines schnellen Regex ist zugunsten des Regex.
Haylem
Sie haben den falschen Teil dieses letzten Satzes hervorgehoben: Der empörende Teil davon ist "from html", nicht "in PHP".
Izkata

Antworten:

20

Warum sind reguläre Ausdrücke so krankhaft attraktiv?

Denn im Unterbewusstsein fühlen sie sich wie ein ganzes intelligentes Programm, das aus eigener Kraft viel erreichen kann, dabei aber umfassend ist und sich selbst anpasst (Denkmuster).

Das ist der Grund, warum die Leute sofort glauben, dass reguläre Ausdrücke eine ihrer textbasierten Aufgaben lösen. Sie glauben, dass es möglicherweise zu viel ist und dass ich es möglicherweise nicht richtig verstanden habe (Sprachen damit analysieren).

Ein kleines Ding mit magischer Kraft. Du kannst doch nicht nein sagen, oder?

user8685
quelle
5
+1 - Eine winzige kryptische Sache, nicht weniger.
AJ Johnson
Hobits sind tricksty
Ben DeMott
49

Wenn das einzige Tool, das Sie haben, ein regulärer Ausdruck ist, sieht jedes Problem so aus ^((?>[a-zA-Z\d!#$%&'*+\-/=?^_{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

Glenatron
quelle
16
Die Versuchung, diese Antwort zu wählen, ist so groß, aber ich denke, ich muss mich wehren, da es meine erste hier offene Frage ist und ich eine Weile Ernsthaftigkeit vortäuschen muss.
Cbrandolino
1
@ Dev, es macht jede Menge Sinn. Mein Kommentar war nur eine vermeintlich lustige Art, meine Wertschätzung für die Antwort auszudrücken.
Cbrandolino
17
Was in aller Welt passt das zusammen?
Tom O'Connor
4
Ich weiß nicht ... Ich denke, das fasst das Ganze ziemlich gut zusammen. Wenn Sie Regex kennen und sich mit den anderen Methoden nicht auskennen, warum sollten Sie danach suchen? Sie haben bereits ein Tool, das bei richtiger Ausführung den Job erledigt. Solange sie nicht über die einfachere Methode stolpern oder darüber informiert werden, wird Regex die allumfassende Methode sein, auch wenn sie komplexer ist, als es sein muss.
Aeo
4
@Tom O'Connor Ich denke, es ist etwas in der Nähe des Regex, um eine RFC 2822-E-Mail-Adresse abzugleichen, aber ich musste ein paar Charaktere herausnehmen, weil sie mit dem Abschlag Chaos anrichteten.
Glenatron
23

Ich denke, es ist weil:

  1. Sie sind im Vergleich zum entsprechenden Code fantastisch kurz (wenn sie richtig verwendet werden) und
  2. Sie werden in allen Programmiersprachen unterstützt, sodass die meisten Entwickler mit ihnen vertraut sind.
Hallidave
quelle
3
# 2 macht Sinn.
Cbrandolino
23

In früheren Phasen meiner Karriere (dh vor PHP) war ich ein Perl-Guru, und ein Hauptaspekt von Perl-Gurudom ist die Beherrschung regulärer Ausdrücke.

In meinem jetzigen Team bin ich buchstäblich der einzige von uns, der nach Regex greift, bevor es andere (normalerweise böseere) Tools gibt. Für den Rest des Teams scheinen sie pure Magie zu sein. Sie rollen zu meinem Schreibtisch und fragen nach einem Regex, für dessen Zusammenstellung ich im wahrsten Sinne des Wortes zehn Sekunden brauche. Dann werden sie umgehauen, wenn es funktioniert. Ich weiß es nicht - ich habe so lange mit ihnen gearbeitet, dass es jetzt nur natürlich ist.

In Ermangelung von Regex-Geläufigkeit bleiben Ihnen Kombinationen von Flow-Control-Anweisungen übrig, die strstr- und strpos-Anweisungen umschließen. Ich würde viel lieber einen eleganten Regex als dreißig Zeilen Suchstrings basteln.

Dan Ray
quelle
2
Ich kann das nicht genug unterstützen.
CaffGeek
8
Ich bin neugierig: Lesen Sie Regexps so flüssig, wie Sie sie schreiben?
Peterchen
7
Ich hoffe, Sie halten regelmäßig Regex-Schulungen ab und / oder dokumentieren die Hölle aus Ihrem Code heraus. ansonsten schaffen Sie einen Support-Albtraum für Ihre Mitarbeiter. Die Zeit, die Sie durch das Schreiben dieses regulären Ausdrucks gespart haben, kann hundertmal verloren gehen, wenn Leute versuchen, einen Sinn für das zu finden, was dieser "elegante reguläre Ausdruck" tut.
Jeff Knecht
3
So großartig. Sie können das Tauziehen zwischen dem Lieben und dem Hassen von Regexen hier in diesen Kommentaren hören.
Dan Ray
1
@Ben Lee: Ich denke schon - OTOH, ich habe noch nie einen kommentierten Regex in freier Wildbahn gesehen. Einige der Probleme mit Regexen können auf einer Haltung der Kühle beruhen.
Peterchen
16

Andererseits. Leute, die den Regex plappern, sind viel zu oft böse , IMO. Es ist offensichtlich, dass preg_match in überlastet ist php, aber es ist weniger offensichtlich, dass es oft sinnvoll ist, dies zu tun (in PHP).

Ich würde so weit gehen und vermuten, dass es eine weitere Mikrooptimierung in PHP ist, die String-Funktionen zu nutzen. Es gibt viele und viele nützliche, und sie sind in der Regel die bessere Wahl. Aber Sie sollten nicht preg_matchfür mehrere strposund ifKetten meiden . Da es sich in der Praxis herausstellt, ist libpcre oft schneller als PHP eine Schleife ausführen kann, die nach String-Alternativen sucht, z

Als ein aktuelles Beispiel wurde mir klar, dass beim Testen, ob eine Zeichenfolge nur Kleinbuchstaben enthält:

 if ($string == strtolower($string))

Ist lesbarer als:

 if (!preg_match("/[A-Z]/", $string))

Und Sie würden davon ausgehen, dass der erste schneller sein muss, da es nur PHP ist. In Wirklichkeit betrachtet der Regex die Zeichenfolge jedoch nur einmal und kann die negierte Bedingung abbrechen, sobald er einen Großbuchstaben findet. Der strtolower () -Ansatz betrachtet die Zeichenfolge jedoch zweimal. First strtolower () dupliziert einen String, indem es über jeden Buchstaben iteriert, ihn vergleicht und in Großbuchstaben schreibt. Dann ==iteriert das Original und die Kopie erneut und vergleicht sie erneut.

Das ist also kein offensichtlicher Fall. Und um objektiv zu sein, ist der erste oft schneller, da man normalerweise nur kurze Saiten vergleicht. Es ist jedoch unerlässlich, nicht blind davon auszugehen, dass PHP-String-Funktionen gegenüber regulären Ausdrücken immer empfehlenswert sind.

(Ich bin versucht, eine weitere Parole über die lustige Antwort von @ bobince in Bezug auf xhtml-reguläre Ausdrücke hinzuzufügen und darüber, wie sie in letzter Zeit häufig auf eine sehr wenig hilfreiche Weise verknüpft wurde. Die objektiveren Antworten unten werden ignoriert.)

Mario
quelle
1
Ich stimme Ihrem Beispiel zu. In diesem speziellen Fall würde ich ohnehin ´strtolower () ´ vorziehen: In unkritischem Code ist sogar eine so große (im Vergleich zur anderen Implementierung) Ausführungszeitoptimierung unerheblich - es sei denn, Sie möchten den Kleinbuchstaben auswerten. eine riesige Textdatei, aber ich kann mir keinen Fall vorstellen, in dem das nützlich wäre.
Cbrandolino
1
@ Cbrandolino: Keine Diskussion dort. Dieses Zeug sollte nur für verschachtelte Schleifen relevant und ausgewertet sein, wo es einen sachlichen Unterschied machen könnte .
Mario
4
+1 Weil die Leute sie immer schlagen, weit mehr als sie unterstützt werden.
Orbling
1
Als einer der "Regexp-Basher": Es macht Spaß zu sehen, wie ein Einzeiler mehr oder weniger ausdrückt, wofür das "manuelle" Parsen von Zeichenfolgen 30 Zeilen benötigt. Wartung leidet jedoch in den meisten realistischen Beispielen. Wenn Sie versuchen, sie auf nicht validierte Eingaben anzuwenden, erfordert die Generierung geeigneter Diagnosen für abgelehnte Eingaben zusätzliche Akrobatik. Für mich ist es der prototypische "Nur Schreiben" -Code - cool für schnelle Skripte, zum Kotzen für langlebige Apps.
Peterchen
1
Jeder, der nicht alle seine regulären Ausdrücke im /xModus schreibt , um Leerzeichen für den Spielraum für kognitives Chunking zuzulassen, und Kommentare, um zu erklären, warum Dinge getan werden, sollte natürlich seine Ohren gepackt haben. Für echte reguläre Ausdrücke mit angemessener Komplexität müssen Sie jedoch in Betracht ziehen, das Top-Down-Design über grammatische reguläre Ausdrücke anzuwenden . Sobald Sie das Licht gesehen haben, kehren Sie nie mehr zurück /@#$^^@#$^&&*)@#/.
Tchrist
8

Reguläre Ausdrücke sind sehr attraktiv, da sie das beste Werkzeug zum Parsen einer regulären Sprache sind.

Sie haben folgende Vorteile:

  • Sie sind prägnant . Im Allgemeinen ist viel mehr Code erforderlich, um eine bestimmte reguläre Sprache mit einem bestimmten Algorithmus zu analysieren, den Sie sich ausgedacht haben, als mit einem regulären Ausdruck.
  • Sie sind schnell zu bedienen. Im Allgemeinen dauert das Schreiben eines Parsers für eine bestimmte reguläre Sprache mit einem bestimmten Algorithmus, den Sie entwickelt haben, viel länger als mit einem regulären Ausdruck.
  • Sie sind einfach . Sobald Sie die Menge der Sonderzeichen und ihre Bedeutung gelernt haben, können Sie leicht einen regulären Ausdruck erstellen (auch wenn es etwas schwieriger ist, sie zu lesen). Regexps sind selbst Sprachen - ein nützliches Merkmal, da sich unsere Spezies zu einer sehr guten Sprache entwickelt hat.
  • Sie sind schnell . Einmal kompiliert, können sie mit einer Zeichenkettenlänge Nin O ( N) übereinstimmen .
  • Sie sind flexibel . Sie können mit jeder regulären Sprache übereinstimmen und viele unserer Daten werden als reguläre Sprache ausgedrückt.
  • Sie sind allgegenwärtig . Die meisten Programmiersprachen unterstützen reguläre Ausdrücke - entweder über externe Bibliotheken oder in die Sprache selbst eingebettet. Es gibt auch nicht zu viele Unterschiede zwischen den regulären Ausdrücken.

Dies macht sie attraktiv für Situationen, für die sie geeignet sind, aber Menschen können sie in Kontexten verwenden, in denen sie nicht das beste Werkzeug sind, weil sie:

  • Verstehe nicht, dass das, was sie zusammenbringen, nicht mit einem regulären Ausdruck (zB HTML) ausgedrückt werden kann.
  • Sie sind faul (auf eine schlechte Weise) - sie kennen ein Werkzeug und erkennen, dass es nicht das beste Werkzeug für das ist, was sie tun, aber es wird in 95% der Fälle problemlos funktionieren und 95% des Lernaufwands eines bestimmten Werkzeugs in Anspruch nehmen Parser oder Schreiben von Grund auf neu.
  • Sie wissen nicht, dass es bessere Werkzeuge gibt.
david4dev
quelle
Ähm, ich bezog mich auf einige besondere Fälle, in denen sie offensichtlich nicht die beste Vorgehensweise sind, aber immer noch verwendet werden. Ich mag Regex (ich meine, ich finde sie langweilig und leblos, aber in manchen Zusammenhängen immer noch sehr nützlich) und weiß, was ihre Vorteile sind.
Cbrandolino
Ich bin mit dem Rest einverstanden, aber schnell und einfach? Die Lernkurve ist steil: Für einen Anfänger ist es schwer herauszufinden, warum ein Ausdruck nicht funktioniert, und jede Regexp-Implementierung scheint zumindest subtile Unterschiede zu haben.
Peterchen
Warum verwechselt jeder das Herausziehen kleiner Teile von HTML mit dem vollständigen Parsen einer vollständigen Webseite in einen vollständigen Analysebaum? Es ist wirklich dumm. Glauben Sie mir, wenn ich HTML-Seiten bearbeite vi, können Sie wetten , dass ich Ihr Leben damit verbringe :%s/foo/bar/gc. Wenn es für einen Editor gut genug ist, ist es für ein Skript gut genug.
Tchrist
6

Hmmm, ich kann nur raten. Vielleicht haben einige Leute die Erfahrung gemacht, dass 30 Zeilen ihres Codes durch einen 20 Zeichen langen regulären Ausdruck ersetzt wurden. Daher fühlt es sich für sie falsch an, stattdessen irgendetwas anderes zu verwenden, wenn reguläre Ausdrücke verwendet werden können.

user281377
quelle
4

Es passt dazu, wie manche Leute denken. Ich mag sie nicht, aber ich habe Freunde, die in regulären Ausdrücken zu denken scheinen. Ich vermute, der Teil ihres Gehirns, der mit Mustern übereinstimmt, ist exponierter als der formale logische. :-)

Lennart Regebro
quelle
6
In Bezug auf unsere Evolutionsgeschichte liegt das nahe. Wir haben Muster zusammengebracht, lange bevor wir Grammatiken definiert oder Syllogismen entdeckt haben.
Glenatron
1
Ich bin nicht einverstanden, Programmierung beinhaltet Logik und Pattern Matching, zwei Bereiche. Regexps sind sehr gut im Pattern Matching und sollten für solche Aufgaben verwendet werden. Zu sagen "Ich mag sie nicht" bedeutet, ein gutes Werkzeug für einen bestimmten Job wegzuwerfen.
Orbling
@Orbling: Die Frage ist nicht, ob sie gut oder schlecht sind, sondern warum manche Leute sie überbeanspruchen und andere nicht.
Lennart Regebro
Die Frage mag sein, aber Ihre Antwort legt nahe, dass der eine oder andere Verstand im Spiel ist und nicht beide.
Orbling
Ich denke nicht, dass "vorschlagen" das richtige Wort ist.
Lennart Regebro
3

Ich denke, die Allgegenwart von Regex beruht auf der Allgegenwart von Strings. Die Zeichenfolge ist die einfachste Datenstruktur, die die meisten von uns zuerst lernen. Da unser gesamter Code in symbolischer Form geschrieben ist, ist es für einen Programmierer selbstverständlich, etwas in symbolischer Form zu modellieren. Aber wenn unsere Programmiersprache Widerstand leistet, wenn wir versuchen, ihre Syntax für unsere cleveren neuen symbolischen Formen zu erweitern, geraten sie alle in Anführungszeichen. Das relationale Datenmodell hat SQL. Das XML-Datenmodell hat XQuery. Aber was ist mit dem bescheidenen String-Datenmodell? Regex!

Erst gestern habe ich über die API nach einem glänzenden neuen Javascript-Framework gesucht, das die Entwicklung von HTML5-Spielen unterstützt. Es verfügt über einen deklarativen Mechanismus zur Beschreibung der wichtigsten Subsysteme, die Ihr Spiel benötigen würde. Wie spezifiziert man diese Merkmale? JSON? Fließende Punktnotation? Eine Anordnung? Nope - Eine Zeichenfolge, die eine durch Kommas und Leerzeichen getrennte Liste von Feature-Namen enthält. Ich frage mich, wie es diese Liste analysiert ...?

WReach
quelle
2

Weil Sie das Ganze auf einmal sehen können. Wenn man das Ganze sieht, kann man leichter damit arbeiten, und das ist immer schön. Es ist so ähnlich wie der Grund, warum viele C ++ - Programmierer immer noch printf-Anweisungen verwenden: Es ist nicht typsicher (obwohl gcc zumindest die Typen von printf-Anweisungen überprüfen kann), und es ist nicht hübsch, aber es ist kompakt und brauchbar.

Wenn es einfach genug ist, dann sind sie oft die beste Art, Dinge zu tun - ihre kompakte Form und viele Fähigkeiten machen sie perfekt für bestimmte Aufgaben. Das Problem tritt auf, wenn Sie den regulären Ausdruck so kompliziert machen, dass Sie ihn nicht mehr lesen können, oder wenn Sie einen komplexen regulären Ausdruck verwenden, um etwas zu tun, das mit einfachen Zeichenfolgenoperationen schneller erledigt werden kann.

Regex muss wie jedes andere leistungsstarke Tool in angemessenem Maße eingesetzt werden - nicht zu viel, nicht zu wenig. Und wenn die Leistung keine große Rolle spielt, ist ein einzelner regulärer Ausdruck manchmal schneller zu schreiben und einfacher zu debuggen als eine Reihe von Zeichenfolgenoperationen.

Michael Kohne
quelle
2

Hmm, die aktuellen Antworten Zentrum zu sehr auf technische Aspekte und die Lesbarkeit Vor / Nachteile (die ist ein wichtiger Punkt). Lassen Sie mich versuchen, es ein bisschen mehr auf die PHP-Umgebung / Community zu verlagern:

  • PHP ist Perls kleine Stiefschwester . Und ein wesentlicher Bestandteil von Perl sind reguläre Ausdrücke (sie haben das erfunden, oder?). Daher ist es eine Ursache, warum reguläre Ausdrücke auch in PHP allgegenwärtig sind.
  • Der Anwendungsfall von PHP ist übrigens nicht viel anders als der Anwendungsfall für reguläre Ausdrücke. PHP wird strukturell zum Zusammenfügen von HTML-Seiten verwendet. Und reguläre Ausdrücke arbeiten mit Text. (Was Wreach gesagt hat)
  • Micro - Optimierung . Wie bereits erwähnt: Benutzer verwenden häufig reguläre Ausdrücke und / oder PHP-Zeichenfolgenfunktionen nach der wahrgenommenen Geschwindigkeit. Ein Kernproblem in PHP-Kreisen, das nicht spezifisch für reguläre Ausdrücke ist.
  • Reguläre Ausdrücke sind eingebaut . In Python, in Java, in C #, in Ruby? es gibt Verfügbarkeit, aber eine Abschreckung, wenn ein zusätzliches Modul geladen werden muss. Und sehen Sie, wie in PHP oder Javascript, wo es ein Kernmerkmal ist, das Verwendungsmuster unterschiedlich ist. Ein weiteres Exponat: CSS, wo es immer häufiger verwendet wird.
  • Das PHP-Handbuch ist fehlerhaft. Das ist oft so. Reguläre Ausdrücke sind leicht auffindbar, und ich habe diese lustige Tatsache verschoben, weil sie in ihrer Offensichtlichkeit langweilig ist: In allen verdammten Tutorials und PHP-Einführungsbüchern wird immer über reguläre Ausdrücke gelehrt, aber es wird keine Aufklärung über Anwendungsfälle gegeben.
  • Die String-API in PHP wurde von denselben Leuten entwickelt, die Ihnen magische Anführungszeichen und den Namespace \ separator gebracht haben. Es ist umfassend, besser als Java, aber in seiner Gesamtheit nicht glamourös. Insbesondere wenn Zeichenfolgen als Objekte verwendet werden können (siehe Python), können Zeichenfolgenfunktionen reguläre Ausdrücke übertreffen.

Aber das nur als Randnotizen. Ich glaube, es sind sowieso hauptsächlich Wahrnehmungs- und technische Gründe, die zu Überbeanspruchung führen und / oder reguläre Ausdrücke im Allgemeinen meiden. Dennoch haben PHP und seine Nutzerbasis einige Eigenschaften, die es zusammensetzen, und warum wir mehr Fragen zu SO darüber sehen [Zitieren benötigt!] Und sie sind dort "krankhaft attraktiv".

Mario
quelle
1

Ich mag reguläre Ausdrücke im Allgemeinen. Ich finde sie leichter zu lesen / verstehen als die 20 Codezeilen, durch die ich sie ersetzen müsste. Kurze reguläre Ausdrücke werden schnell gelesen und verstanden und sind relativ einfach zu pflegen (wenn sich der Ausdruck ändert, müssen Sie nur eine Zeile ändern, während Sie die 20 Codezeilen durchsehen müssen, um die Änderung vorzunehmen). Es gibt Zeiten, in denen sie missbraucht werden, aber auch viele andere Dinge.

Der Grund, warum Sie wahrscheinlich so viel Missbrauch sehen, ist, dass Sie den PHP-Bereich von StackOverFlow durchsuchen, da Sie sicher sind, dass es viele umm unreife PHP-Programmierer gibt.

stoj
quelle
1

Warum sind reguläre Ausdrücke so krankhaft attraktiv?

Sie sind nicht. Sie sind wirklich hässlich wie die Hölle. Und unverständlich. Sie sind ein Gräuel, der so schnell wie möglich getötet werden sollte.

Vor diesem Hintergrund werde ich wieder eine kleine Perl-App debuggen. Kann es nicht ändern; Leider sind sie manchmal immer noch das beste Werkzeug für diesen Job.

Rook
quelle
4
Ich sage gern, dass reguläre Ausdrücke weder "regulär" noch "expressiv" sind
Andrew Barber
2
Sie sind hässlich und unverständlich, wenn Sie sie nicht verstehen. Sobald Sie den Zen von Regex erreicht haben, sind sie wirklich sehr elegant.
Dan Ray
1
-1 Für die Entscheidung, dass alle Programmierer gerne dunkel sind und dann keine andere mögliche Erklärung in Betracht ziehen. ... Es hätte geholfen, zu erklären, warum Sie sie für hässlich oder unverständlich halten.
Macneil
1
@Macneil - Bitte (obwohl ja, meine Gedanken sind in dieser Richtung), wenn Sie mich nicht zitieren, geben Sie nicht an, dass ich etwas gesagt / entschieden habe, was ich nicht getan habe (der erste Teil Ihres Kommentars). Was deine Frage betrifft, findest du sie schön ?! ... Ich nicht. Und da dies eine subjektive Seite ist und das eine subjektive Meinung ist, muss und möchte ich nicht näher darauf eingehen. Ich werde es auch nicht versuchen.
Turm
1
@Rook - Ich denke, die meisten Leute betrachten einen komplexen regulären Ausdruck, entscheiden, dass alle regulären Ausdrücke hässlich sind, und hören dann auf zu denken. Tatsache ist, dass sie ein sehr elegantes und ausdrucksstarkes Werkzeug sind, wenn Sie Ihre Vorurteile über sie niederlegen können. Übrigens, nach Ihrer eigenen Logik können viele Programmierer keine Algebra schreiben, daher ist Algebra wahrscheinlich von Natur aus böse und sollte abgeschafft werden, da sie eindeutig nicht sehr verständlich ist.
Dan Ray
0

Der Mensch ist eine Kreatur, die Werkzeuge benutzt, und reguläre Ausdrücke sind mächtige Werkzeuge. Eine schöne Metapher für reguläre Ausdrücke ist ein Fleischschneider aus einem Feinkostgeschäft. Wenn Sie hauchdünne Scheiben Pute, Corned Beef usw. möchten, ist dies genau das Richtige. Sie brauchen jedoch geschickte Hände, um es zu benutzen, weil Sie sich damit wirklich schwer schneiden können und Sie nichts fühlen werden, bis Sie das Blut sehen. Was ich damit meine ist, dass das große Problem bei regulären Ausdrücken darin besteht, dass sie leicht verschoben werden, dass Sie mit etwas übereinstimmen, das Sie nicht sollten, oder umgekehrt, und dass Sie es erst herausfinden, wenn es später zu einem Problem führt.

Larry Coleman
quelle
0

Reguläre Ausdrücke sind sehr attraktiv, weil sie Macht ausüben. Sie können ein sehr kompliziertes Stück Arbeit in sehr wenigen Charakteren erledigen.

Das Problem ist , dass der Standard für reguläre Ausdrücke Konstrukt wird nicht Turing-vollständig , was bedeutet , dass es Programme , die Sie einfach nicht mit einem regulären Ausdruck umsetzen können, und die Menschen nicht wissen , dass , wenn sie durch die Scheinleistung von regulären Ausdrücken gelockt werden.

Dies ist wohl der Grund für das Zitat von "Jetzt haben sie zwei Probleme".

Ich würde vermuten, dass reguläre Perl-Ausdrücke Turing-vollständig sind, aber anscheinend wurde es noch nicht entscheidend bewiesen oder widerlegt.

user1249
quelle
0

Weil es eine effiziente Möglichkeit ist, eine Finite-State-Maschine zu programmieren, die dann ein mächtiges Werkzeug ist, wenn sie angewendet wird. Es ist im Grunde genommen eine eigene Sprache zum Programmieren von FSMs, was hilfreich ist, wenn Sie die Sprache kennen, und ärgerlich, wenn Sie dies nicht tun.

DanTilkin
quelle
0

Meiner Erfahrung nach sind Regexes wie eine alte Kunst, etwas Dunkles, manche Leute ärgern sich über sie, weil sie die Hexerei nicht verstehen können und vielleicht weil niemand sie Ihnen erklären wird. Ich habe noch nie von Universitäten gehört, die sie für etwas weniger Triviales unterrichten als für das Abgleichen einer E-Mail. Dann gibt es das mystische Innenleben davon, da die meisten Leute sie nicht verstehen, müssen sie langsam sein . Und es ist für Neulinge immer eine Herausforderung, sie gleich beim ersten Versuch zum Laufen zu bringen.

Das Gleiche gilt für Perl, awk, Linux und alles, was keine glänzenden Tasten oder eine schöne farbige Syntax hat. Es ist also wie eine zusätzliche Komplexität für "triviale Aufgaben", wirf einfach ein paar Schleifen, Splits, einen Schalter, etwas Magie und das ist es, etwas, das funktionieren könnte. Aber gut, wenn Sie auf der anderen Straßenseite sind, sind Regexes schöne Ausstechformen, die wie Signalrauschen aussehen, ohne böse Schleifen oder mehr zu debuggendes Zeug. Ich mag sie auch für die Flexibilität, die sie bieten. Wenn sich das passende Muster ändert, ändern Sie einfach die Regex, nicht den Algorithmus oder das Werkzeug / was auch immer, und es ist schön und funktioniert wieder. Und da es sich um eine magische Zeichenfolge handelt, können Sie sie auf Wunsch auch außerhalb des Quellcodes platzieren. Und eine andere Sache, die mich an Perl denken lässt: Wenn Sie einen regulären Ausdruck schreiben, der mehr als 20 Zeichen lang ist, haben Sie das Gefühl, viel erreicht zu haben. Zumindest für mich ist es einfach so ordentlich und kompakt. Ich bin auch ein fauler Programmierer, ich schreibe nicht gerne viel Code mit netten Identifikationen und Kommentaren und füge ein paar Bugs hinzu.

alfa64
quelle