Warum sind reguläre Ausdrücke so kontrovers?
Bei der Erkundung von regulären Ausdrücken (sonst bekannt als RegEx-es), es gibt viele Menschen, die scheinen, um zu sehen, reguläre Ausdrücke, wie der Heilige Gral. Etwas, das so kompliziert aussieht - nur muss die Antwort auf jede Frage. Sie neigen dazu zu glauben, dass jedes problem lösbar ist die Verwendung von regulären Ausdrücken.
Auf der anderen Seite gibt es auch viele Menschen, die versuchen zu vermeiden, reguläre Ausdrücke an allen Kosten. Sie versuchen einen Weg zu finden, um reguläre Ausdrücke und übernehmen zusätzliche Codierung nur aus Gründen der es, selbst wenn ein regulärer Ausdrücke wäre eine kompaktere Lösung.
Warum sind reguläre Ausdrücke als so umstritten? Gibt es weit verbreitete Missverständnisse darüber, wie Sie arbeiten? Oder könnte es sein, eine Breite überzeugung, dass reguläre Ausdrücke sind in der Regel langsam?
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass die Leute gegen reguläre Ausdrücke, weil Sie langsam sind, sondern weil Sie schwer zu Lesen und zu schreiben, sowie schwierig zu bekommen Recht. Zwar gibt es einige Situationen, in denen reguläre Ausdrücke bieten eine effektive, kompakte Lösung für das problem, Sie sind manchmal bugsiert, in Situationen, wo es besser ist, um eine leicht lesbare, wartbare code-Abschnitt statt.
InformationsquelleAutor der Antwort
Machen Regexes Wartbar
Einen großen Fortschritt in Richtung entmystifizieren die Muster, die zuvor bezeichnet als "reguläre Ausdrücke" ist das Perl
/x
regex-flag — manchmal geschrieben(?x)
wenn eingebettet, die es Ihnen ermöglicht whitespace-Zeichen (Zeilenumbrüche, Einrückungen und Kommentaren. Dies ernsthaft verbessert die Lesbarkeit und somit die Wartbarkeit. Der weiße Raum ermöglichen kognitives chunking, so können Sie sehen, welche Gruppen mit welchen.Moderne Muster, auch jetzt unterstützen beide relativ nummeriert und benannt Rückverweise jetzt. Das bedeutet, dass Sie nicht mehr brauchen, um count capture-Gruppen, um herauszufinden, dass Sie müssen
$4
oder\7
. Diese hilft beim erstellen von mustern, die aufgenommen werden können, in weitere Muster.Hier ist ein Beispiel einer relativ nummeriert capture group:
Und hier ist ein Beispiel für die überlegene Herangehensweise des namens erfasst:
Grammatischen Regexes
Am besten von allen diese benannten erfasst werden können, die innerhalb einer
(?(DEFINE)...)
sperren, so dass Sie können trennen die Erklärung, die die Ausführung der einzelnen benannten Elemente Ihrer Muster. Das macht Sie handeln und nicht wie Unterprogramme innerhalb des Musters.Ein gutes Beispiel für diese Art von "grammatischen " regex" kann gefunden werden in diese Antwort und diese eine. Diese sehen viel mehr wie eine grammatikalische Erklärung.
Als die letztere erinnert Sie:
Diese nicht über-betont werden. Natürlich, wenn Sie Sie nicht verwenden, diese Dinge in Ihre Muster, die Sie erstellen oft ein Alptraum. Aber wenn Sie tun verwenden, obwohl, müssen Sie nicht.
Hier ist ein weiteres Beispiel eines modernen grammatischen Muster, das man für die Analyse RFC 5322:
verwenden 5.10.0;
Ist das nicht bemerkenswert und großartig? Sie können eine BNF-Stil, Grammatik und übersetzen Sie direkt in den code, ohne seine grundlegende Struktur!
Wenn die moderne grammatische Muster noch sind nicht genug für Sie, dann Damian Conway ist genial
Regexp::Grammars
- Modul bietet eine noch sauberere syntax, mit superior-debugging auch. Hier ist der gleiche code für die Analyse RFC 5322 Neufassung in ein Muster von diesem Modul:Gibt es eine Menge guter Sachen in die perlre man-pageaber diese dramatischen Verbesserungen in grundlegenden regex design-Merkmale sind nicht nur bei den Perl-allein. In der Tat die pcrepattern man-page kann eine leichter zu Lesen, und Sie deckt das gleiche Gebiet.
Moderne Muster haben fast nichts gemein mit den primitiven Dinge, die Sie gelehrt wurden, in Ihre endliche Automaten Klasse.
InformationsquelleAutor der Antwort
Regexes sind ein tolles Werkzeug, aber die Leute denken "Hey, was für ein tolles tool, ich werde es verwenden, um X zu tun!", wobei X ist etwas, das mit einem anderen tool ist es besser, (in der Regel ein parser). Es ist der standard, mit einem hammer, wo Sie brauchen Schraubendreher problem.
InformationsquelleAutor der Antwort
Fast alle die ich kenne, verwendet reguläre Ausdrücke, regelmäßig (Wortspiel beabsichtigt) von einem Unix-ish hintergrund, wo Sie tools, die Behandlung von REs als first-class-Programmierung Konstrukte wie grep, sed, awk und Perl. Da gibt es fast keine syntaktischen overhead einen regulären Ausdruck zu verwenden, Ihre Produktivität geht Weg, wenn Sie tun.
Im Gegensatz Programmierer, die Sprachen, in denen die REs sind in einer externen Bibliothek, neigen nicht dazu, zu überlegen, was reguläre Ausdrücke können an den Tisch bringen. Der Programmierer "Zeit-Kosten" so hoch, dass entweder a) REs erschien nie als Teil Ihrer Ausbildung, oder b) Sie nicht "denken" im Sinne von REs und lieber fallen zurück auf mehr vertraute Muster.
InformationsquelleAutor der Antwort
Reguläre Ausdrücke ermöglichen Ihnen das schreiben eines benutzerdefinierten finite-state-Maschine (FSM) in einer kompakten Art und Weise, um einen string von der Eingabe. Es gibt mindestens zwei Gründe, warum mit regulären Ausdrücken ist schwer:
Old-school-software-Entwicklung erfordert eine Menge Planung, Papier-Modelle und reiflicher überlegung. Reguläre Ausdrücke passen in dieses Modell sehr gut, denn zum schreiben eines wirksamen Ausdruck richtig gehört eine Menge starrte es an, visualisieren Sie die Pfade der FSM.
Moderne software-Entwickler würden viel lieber den hammer auf code, und verwenden Sie einen debugger zu Schritt über die Ausführung, um zu sehen, ob der code richtig ist. Reguläre Ausdrücke werden nicht unterstützt diese Arbeitsweise sehr gut. Ein "run" der reguläre Ausdruck ist effektiv eine Atomare operation. Es ist schwer zu beobachten, schrittweise Ausführung im debugger.
Es ist zu einfach zu schreiben ist ein regulärer Ausdruck, der versehentlich akzeptiert mehr input, als Sie beabsichtigen. Der Wert ein regulärer Ausdruck ist nicht wirklich passend gültige Eingabe, es zu nicht überein ungültige Eingabe. Techniken zu tun "negativ-tests" für reguläre Ausdrücke sind nicht sehr Fortgeschritten, oder zumindest nicht weit verbreitet.
Dieser geht an die Stelle von regulären Ausdrücken schwer zu Lesen. Nur indem wir einen regulären Ausdruck, dauert es eine Menge Konzentration die Visualisierung aller möglichen Eingaben, die abgelehnt werden sollten, aber fälschlicherweise angenommen. Haben Sie jemals versucht zu Debuggen jemand anderes code für den regulären Ausdruck?
Wenn es einen Widerstand gegen die Verwendung von regulären Ausdrücken unter software-Entwicklern heute, ich denke, es ist vor allem diese beiden Faktoren.
InformationsquelleAutor der Antwort
Menschen neigen dazu zu glauben reguläre Ausdrücke sind schwer; aber das ist, weil Sie mit Ihnen falsch. Schreiben von komplexen Einzeiler ohne jegliche Kommentare, Einrückungen oder Namen erfasst. (Sie müssen nicht Stopfen Ihre komplexen SQL-Ausdruck in einer Zeile, ohne Kommentare, Einrückungen oder Aliasnamen, tun Sie?). Also ja, für viele Menschen, Sie machen keinen Sinn.
Allerdings, wenn Ihr job hat alles zu tun mit der Analyse von text (etwa jeder web-Anwendung gibt...) und Sie nicht wissen, regulärer Ausdruck, Sie saugen an Ihre Aufgabe, und Sie verschwenden Ihre eigene Zeit und die des Arbeitgebers. Es gibt hervorragende Ressourcen gibt, Sie zu unterrichten alles über Sie, die Sie jemals brauchen werden, zu wissen, und mehr.
InformationsquelleAutor der Antwort
Weil Sie nicht über die beliebtesten learning-tool in der allgemein angenommenen IDEs: Es gibt keine Regex-Assistenten. Nicht einmal die Autovervollständigung. Sie müssen code die ganze Sache selbst.
InformationsquelleAutor der Antwort
Ich glaube nicht, Sie sind kontrovers.
Ich denke auch, Sie haben irgendwie Ihre eigene Frage beantwortet, weil Sie darauf hinweisen, wie dumm es wäre, Sie zu benutzen überall (Nicht alles ist eine reguläre Sprache Zwei) oder Sie zu vermeiden, mit Ihnen überhaupt. Sie, die Programmierer, haben, um eine intelligente Entscheidung über den Zeitpunkt der regulären Ausdrücke, die helfen werden, den code oder die ihm Schaden. Bei solch einer Entscheidung, zwei wichtige Dinge im Auge zu behalten sind die Wartbarkeit (das impliziert die Lesbarkeit) und Erweiterbarkeit.
Für diejenigen, die sind besonders abgeneigt, meine Vermutung ist, dass Sie haben nie gelernt, Sie richtig zu verwenden. Ich denke, die meisten Menschen, die verbringen nur ein paar Stunden mit einem anständigen tutorial wird Ihnen herauszufinden und sich fließend, sehr schnell. Hier ist mein Vorschlag für wo, um loszulegen:
http://docs.python.org/howto/regex
Obwohl, die Seite spricht über reguläre Ausdrücke im Kontext von Python, die ich gefunden habe, die Informationen sehr zutreffend an anderer Stelle. Es gibt ein paar Dinge, die Python-spezifisch, aber ich glaube, Sie sind klar und deutlich angegeben, und leicht zu merken.
InformationsquelleAutor der Antwort
"Reguläre Ausdrücke: Nun Haben Sie Zwei Probleme" ist ein großer Artikel von Jeff Atwood über die Angelegenheit. Im Grunde, reguläre Ausdrücke sind "hart"! Sie kann neue Probleme schaffen. Sie sind wirksam, aber.
InformationsquelleAutor der Antwort
Reguläre Ausdrücke sind Zeichenfolgen, welche arithmetischen Operatoren sind zu zahlen, und ich würde nicht halten Sie Sie für umstritten. Ich denke, dass auch ein ziemlich millitant OO Aktivistin wie mich (wer würde dazu neigen, wählen Sie andere Objekte über Saiten) wäre hart gedrückt, um Sie abzulehnen.
InformationsquelleAutor der Antwort
Das problem ist, dass regexes sind potentiell so mächtig, dass Sie können Dinge tun, mit Ihnen, die Sie verwenden sollten etwas anderes für.
Einen guten Programmierer sollte wissen, wo Sie zu verwenden sind und wo nicht. Das typische Beispiel ist die Analyse nicht-reguläre Sprachen (siehe Die Entscheidung, ob eine Sprache regulär ist).
Ich denke, dass Sie kann nicht schief gehen, wenn Sie auf den ersten beschränken Sie sich auf real reguläre Ausdrücke (keine Erweiterungen). Einige Erweiterungen können Ihr Leben ein bisschen einfacher, aber wenn Sie etwas finden, schwer auszudrücken, als real regex, kann dies auch ein Hinweis darauf, dass ein regex ist nicht das richtige Werkzeug.
InformationsquelleAutor der Antwort
Kann man fast genauso gut Fragen, warum die goto ' s sind umstritten.
Im Grunde, wenn man so viel "offensichtlich", macht, Menschen, die geeignet sind, die Sie missbrauchen für Situationen, Sie sind nicht die beste option für. Die Zahl der Menschen zu Fragen, um zu analysieren, CSVs oder XML oder HTML in regexes, zum Beispiel, macht mich staunen. Es ist das falsche Werkzeug für den job. Aber einige Benutzer darauf bestehen, mit regexes sowieso.
Persönlich, ich versuche zu finden, die gerne medium - verwenden Sie regexes für was Sie gut sind, und meiden Sie diese, wenn Sie sind weniger als optimal.
Beachten Sie, dass regexes kann immer noch verwendet werden, um zu analysieren CSVs, XML, HTML, etc. Aber in der Regel nicht in einem einzigen regex.
InformationsquelleAutor der Antwort
Ich glaube nicht, dass "umstritten" ist das richtige Wort.
Aber ich habe gesehen Tonnen von Beispielen, wo die Menschen sagen: "was ist der reguläre Ausdruck muss ich tun, so-und-so ein string-manipulation?", das sind X-Y Probleme.
In anderen Worten, Sie haben angefangen, von der Annahme aus, dass ein regex ist, was Sie brauchen, aber Sie wären besser dran mit einem Spalt(), eine übersetzung, wie perl tr///, in dem Zeichen ersetzt, der eine für den anderen, oder einfach nur index().
InformationsquelleAutor der Antwort
Dies ist ein Interessantes Thema.
Viele regexp - Fans scheinen es zu verwechseln, die Prägnanz der Formel mit dem Wirkungsgrad.
Auf top von, dass, eine regexp, die erfordert eine Menge Gedanken produziert, um seinen Autor, eine massive Zufriedenheit, macht es legitim sofort.
Aber... regexps sind so bequem, wenn die Leistung ist nicht ein Problem, und Sie benötigen, um schnell mit einer text-Ausgabe, in Perl zum Beispiel. Auch, während die Leistung ist ein Problem, man kann es vorziehen, nicht zu versuchen, Sie zu schlagen die regexp-Bibliothek mit einer hausgemachten Algorithmus, kann buggy sein oder weniger effizient.
Daneben gibt es eine Reihe von Gründen, die regexps sind ungerecht kritisiert, zum Beispiel
InformationsquelleAutor der Antwort
Was ich denke, ist, zu Lernen, Regex und Pflege regex macht unbeliebt,
die meisten Entwickler faul sind oder die meisten von Ihnen verlassen sich auf externe Bibliotheken zu tun, die Analyse, was für Sie... Sie verlassen sich auf google für die Antwort und auch Fragen in den Foren zu den vollständigen code für Ihr problem.
Aber wenn Sie kommt, zu implementieren oder ändern/pflegen eine regex, die Sie einfach nicht.
Es gibt ein Sprichwort: "Friends dont let Friends use Regex zum Parsen von HTML"
Aber so weit ich bin besorgt, die ich gemacht habe die komplette HTML-Parser mit Regex und ich finde meinen selbst, dass regex sind besser beim Parsen von html-strings sowohl Geschwindigkeit her und Speicher-Weise(wenn Sie eine Idee haben, was Sie, was zu erreichen 🙂 )
InformationsquelleAutor der Antwort
Reguläre Ausdrücke sind ein ernstes Rätsel für viele Menschen, einschließlich mir selbst. Es funktioniert Super, aber es ist wie der Blick auf eine mathematische Gleichung. Ich bin froh zu berichten, aber dass, jemand hat endlich eine konsolidierte Position der verschiedenen regulären Ausdruck Funktionen bei http://regexlib.com/. Nun, wenn Microsoft nur einen regulären Ausdruck-Klasse, würde automatisch nicht viel von den gängigen Sachen wie Beseitigung von Buchstaben oder filtern von Daten.
InformationsquelleAutor der Antwort
Finde ich reguläre Ausdrücke von unschätzbarem Wert in Zeiten. Wenn ich einige "fuzzy" - Suche, und vielleicht ersetzt. Wenn die Daten können variieren und haben eine gewisse Zufälligkeit.
Allerdings, wenn ich tun müssen, um ein einfaches suchen und ersetzen, oder prüfen, ob ein string, weiß ich nicht, reguläre Ausdrücke verwenden. Obwohl ich kenne viele Leute, die es tun, werden Sie verwenden es für alles. Das ist die Kontroverse.
Wenn Sie wollen, um eine Wende in der Wand, nicht mit einem hammer. Ja, es wird funktionieren, aber mit der Zeit bekommen Sie der hammer, ich könnte 20 Reißzwecken in die Wand.
Reguläre Ausdrücke verwendet werden sollte, für was Sie konzipiert wurden, und nichts weniger.
InformationsquelleAutor der Antwort
Bekommen RegexBuddy. Dann werden Sie schleuderte reguläre Ausdrücke, um wie ein Profi und als !!bonus!! Sie beginnen, Sie zu verstehen!
InformationsquelleAutor der Antwort
Während ich denke, regexes sind ein wesentliches Instrument, das nervigste daran ist, dass es verschiedene Implementierungen. Leichte Unterschiede in der syntax, Modifikatoren und -vor allem - die "Gier" kann die Dinge wirklich chaotisch, erfordern trial-and-error und manchmal erzeugen rätselhaften Fehler.
InformationsquelleAutor der Antwort
In einigen Fällen ich denke, Sie HABEN, Sie zu benutzen. Zum Beispiel bauen Sie einen lexer.
Meiner Meinung nach, ist dies ein Punkt der Sicht von Menschen, die schreiben können, regexp und Menschen, die nicht (oder kaum).
Ich personnaly Sache, das ist eine gute denke zum Beispiel an gültige Eingabe eine form, sei es in javascript um den Benutzer zu warnen, oder server-side-Sprache.
InformationsquelleAutor der Antwort
Ich denke, es ist eine weniger bekannte Technik, die unter Programmierern. Es ist also nicht eine Breite Akzeptanz für ihn. Und wenn Sie eine nicht-technische manager, überprüfen Sie Ihren code oder überprüfen Sie Ihre Arbeit dann ein regulärer Ausdruck ist sehr schlecht. Sie werden Stunden damit verbringen, das schreiben einer perfekten regulären Ausdruck, und erhalten Sie paar Mark für das Modul denken, er/Sie hat geschrieben, so ein paar Zeilen code.
Auch, wie gesagt, anderswo, Buch reguläre Ausdrücke sind sehr schwierige Aufgabe.
InformationsquelleAutor der Antwort
Anständige regulären Ausdruck Systemen, wie Sie in lex und yacc compiler-definition sind gut, sehr nützlich und sauber. In diesen Systemen, Ausdrucks-Typen sind definiert in Bezug auf andere. Es ist das abscheuliche, in die fehlerhafte Zeile nicht lesbar-Lärm Riesen one-liner regular expressions, die man üblicherweise in perl und sed-code (usw.) 'umstritten' (Müll).
InformationsquelleAutor der Antwort
Die besten gültige und normalen Gebrauch für regex für E-Mail-Adresse format-Validierung.
Ist, dass eine gute Anwendung.
Habe ich verwendet reguläre Ausdrücke unzählige Male als one-offs in TextPad zur massage flat-Dateien, erstellen von csv-Dateien, erstellen von SQL-insert-Anweisungen und dergleichen.
Gut geschrieben reguläre Ausdrücke sollten nicht zu langsam sein. In der Regel die alternativen, wie Tonnen von anrufen zu Ersetzen sind viel langsamer Optionen. Könnte genauso gut tun Sie es in einem Durchgang.
Vielen Situationen genau das, reguläre Ausdrücke und sonst nichts.
Ersetzen spezielle nicht druckbare Zeichen mit harmlosen Zeichen ist eine andere gute Verwendung.
Ich kann mir natürlich vorstellen, dass es einige codebase, dass übermäßiger Gebrauch von regulären Ausdrücken zu Lasten der Wartbarkeit. Ich habe noch nie erlebt dass mich. Ich habe eigentlich schon mied von code Reviewern für keine regulären Ausdrücke genug.
InformationsquelleAutor der Antwort