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_replace
anstelle 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 ).
quelle
Antworten:
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?
quelle
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)>)$
quelle
Ich denke, es ist weil:
quelle
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.
quelle
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_match
für mehrerestrpos
undif
Ketten meiden . Da es sich in der Praxis herausstellt, ist libpcre oft schneller als PHP eine Schleife ausführen kann, die nach String-Alternativen sucht, zAls ein aktuelles Beispiel wurde mir klar, dass beim Testen, ob eine Zeichenfolge nur Kleinbuchstaben enthält:
Ist lesbarer als:
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.)
quelle
/x
Modus 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/@#$^^@#$^&&*)@#/
.Reguläre Ausdrücke sind sehr attraktiv, da sie das beste Werkzeug zum Parsen einer regulären Sprache sind.
Sie haben folgende Vorteile:
N
in O (N
) übereinstimmen .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:
quelle
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.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.
quelle
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. :-)
quelle
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 ...?
quelle
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.
quelle
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:
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".
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle