Wie wichtig ist es Regexs zu kennen?

8

Meine persönliche Erfahrung ist, dass Regexs Probleme lösen, die auf andere Weise nicht effizient gelöst werden können, und die in einer Welt, in der Strings ebenso wichtig sind wie solche, die es nicht ausreichen, das Thema nicht zu verstehen Grund für mich, dich als Senior-Programmierer einzustellen (ein Junior hat immer die Möglichkeit, zu trainieren).

Allerdings.

Eine Anzahl von Antworten auf das wiederkehrende "Was ist der Regex dafür?" Tippfragen legen nahe, dass viele Programmierer sie irgendwo zwischen unverständlich und undurchsichtig finden.

Es geht nicht darum, ob eine einfache indexOf oder substring eine bessere Lösung ist, das ist eine technische Angelegenheit, und manchmal ist der einfache Weg richtig, manchmal eine Regex und manchmal auch nicht (Blick auf Ihre HTML-Parser-Fragen).

Hier geht es darum, wie wichtig es ist, Regex zu verstehen und ob die Anti-Regex-Meinung (die Trite "... jetzt haben sie zwei Probleme" -Ding) verdiente oder FUD ist.

Sollte von einem Programmierer erwartet werden, Regexs zu verstehen? Ist das eine erforderliche Fähigkeit?

edit: Nur für den Fall, dass es nicht klar ist, frage ich nicht, ob ich sie lernen muss (ich bin ein Verteidiger des Glaubens), aber ob die Anti- Camp-have sind eine evolutionäre Sackgasse oder ob es eine unnötige Nischen-Fähigkeit wie InstallShield ist.

    
annakata 06.02.2009, 11:16
quelle

16 Antworten

26
Mit den

REs können Sie relativ komplexe Probleme lösen, bei denen Sie sonst komplette Parser mit Backtracking und all diesen unordentlichen Dingen programmieren müssten. Ich vergleiche die Verwendung von REs mit Kettensägen, um einen Baum zu fällen, anstatt es mit einem Stück Sellerie zu versuchen.

Sobald Sie gelernt haben, die Kettensäge sicher zu benutzen, werden Sie nie mehr zurückgehen. Menschen, die weiterhin Anti-RE-Propaganda verbreiten, werden niemals so produktiv sein wie diejenigen von uns, die gelernt haben, sie zu lieben.

Also ja, Sie sollten wissen, wie man REs benutzt, auch wenn Sie nur die grundlegenden Konstrukte verstehen. Sie sind ein Werkzeug wie jedes andere.

    
paxdiablo 06.02.2009, 11:23
quelle
18

Es gibt einige Aufgaben, bei denen reguläre Ausdrücke das beste Werkzeug sind.
Es gibt einige Aufgaben, bei denen reguläre Ausdrücke sinnlos sind.
Es gibt einige Aufgaben, bei denen sie angemessen sind, aber ein anderer Ansatz kann besser lesbar sein.

Im Allgemeinen denke ich daran, einen regulären Ausdruck zu verwenden, wenn ein tatsächliches Muster beteiligt ist. Wenn Sie nur nach einer bestimmten Zeichenfolge suchen, würde ich normalerweise keine Regex verwenden. Als ein Beispiel für eine Grauzone hat jemand einmal in einer Newsgroup gefragt, wie man am besten prüfen kann, ob eine Zeichenkette eine oder mehrere Zeichenketten enthält. Die zwei Wege, die kamen, waren:

  • Erstellen Sie eine Regex mit Alternativen und führen Sie eine einzelne Übereinstimmung aus.
  • Testen Sie jeden String nacheinander mit string.Contains .

Ich persönlich denke, dass der zweite Weg viel einfacher ist - man braucht sich keine Gedanken darüber zu machen, ob man nach den gesuchten Strings oder anderen Kenntnissen über reguläre Ausdrücke (und ihre unterschiedlichen Geschmacksrichtungen) sucht verschiedene Plattformen).

Als Beispiel dafür, dass reguläre Ausdrücke eindeutig die falsche Wahl sind, hat jemand ernsthaft vorgeschlagen, einen regulären Ausdruck zu verwenden, um zu testen, ob eine Zeichenfolge drei Zeichen lang ist oder nicht. Ihr regulärer Ausdruck funktionierte nicht einmal, obwohl sie behaupteten, dass der Grund, warum sie zuerst an reguläre Ausdrücke dachten, der ist, dass sie sie so lange benutzt haben und dass sie natürlich in regulären Ausdrücken "gedacht" haben.

Es gibt jedoch viele Beispiele, bei denen reguläre Ausdrücke das Leben wirklich erleichtern - wie ich sage, wenn Sie tatsächlich Muster zusammenbringen: "Ich möchte einen Buchstaben, dann drei Ziffern ein anderer Buchstabe "oder was auch immer. Ich finde mich selbst nicht oft mit regulären Ausdrücken, aber wenn ich sie benutze, sparen sie eine Menge Arbeit.

Kurz gesagt, ich finde es gut, reguläre Ausdrücke zu kennen - aber auch vorsichtig zu sein, wann man sie benutzt. Es ist einfach, mit schreibgeschütztem Code zu enden, der durch einfaches Umschreiben mit einfachen String-Operationen einfacher zu verstehen ist, selbst wenn der resultierende Code etwas länger ist.

BEARBEITEN: Als Antwort auf die Bearbeitung der Frage ...

Ich denke nicht, dass es eine gute Idee ist, über sie zu evangelisieren - nach meiner Erfahrung neigt dazu dazu zu führen, sie zu verwenden, wo eine Alternative einfacher wäre, und das macht Sie nur schlecht aussehen . Wenn Sie andererseits auf jemanden stoßen, der komplizierten Code mit einem regulären Ausdruck in vermeiden schreibt, ist es in Ordnung, darauf hinzuweisen, dass eine Regex den Code einfacher macht.

Persönlich mag ich meine regulären Ausdrücke sehr detailliert kommentieren, indem ich sie auf mehrere Zeilen unterscheide, mit einem Kommentar zwischen jeder Zeile. Auf diese Weise sind sie einfacher zu pflegen, und es sieht nicht so aus, als ob du nur versuchst, "hardcore" zu sein (was der Eindruck sein kann, auch wenn es nicht das eigentliche Ziel ist) ).

Ich denke, das Wichtigste ist, sich daran zu erinnern, dass es kurz! = lesbar ist. Niemals behaupten, dass die Verwendung einer Regex besser ist, weil sie weniger Code erfordert - behaupten Sie, dass es besser ist, wenn es wirklich einfacher und einfacher zu verstehen ist (oder wo es einen signifikanten Leistungsvorteil gibt).

    
Jon Skeet 06.02.2009 11:35
quelle
6

Als Entwickler sollten Sie die Vor- und Nachteile von so vielen Tools wie möglich kennen, die vorgefertigte Lösungen für Ihre Probleme bieten könnten. Jeder Entwickler sollte wissen, wie man mit regulären Ausdrücken arbeitet, und ein Gefühl dafür haben, wann er verwendet werden sollte und wann es einfacher ist, einfache Zeichenfolgenfunktionen zu verwenden, um ein Ziel zu erreichen.

Ich lehne sie ab, weil sie schwer zu lesen sind. Ein Entwickler, der so denkt, entzieht sich selbst ein wertvolles Werkzeug zum Suchen und Validieren komplexer String-Muster.

    
Sebastian Dietz 06.02.2009 11:26
quelle
3

Ich habe wirklich gemischte Gefühle. Ich habe sie benutzt und kenne die Knochen der Syntax und etwas in mir liebt ihre Prägnanz. Sie werden jedoch nicht allgemein verstanden und sind eine stark verschleierte Form von Code. Ich würde auch gern Vergleiche mit ähnlichen Operationen in normalem Code sehen. Es steht außer Frage, dass der explodierte Code wartungsfreundlicher und leichter verständlich ist, was in jedem kommerziellen Softwareprojekt eine ernsthafte Überlegung darstellt.

Selbst wenn sich herausstellt, dass sie leistungsfähiger sind, würde das Argument für sie zu ihrer logischen Schlussfolgerung führen, dass wir alle Assembler in unseren Code für wichtige Schleifen einbetten würden - vielleicht sollten wir es tun. Ordentlich und prägnant und sehr schnell, aber fast nicht zu warten.

Alles in allem denke ich, dass, bis die Regex-Syntax zum Mainstream wird, sie wahrscheinlich mehr Probleme verursachen als sie lösen und nur sehr vorsichtig verwendet werden sollten.

    
Simon 06.02.2009 11:38
quelle
3

In dem Artikel von Steve Yegge sollten Sie Fragen zum fünffachen Telefonbildschirm lesen der Abschnitt "Bereich Nummer drei: Skripte und reguläre Ausdrücke".

Steve Yegge hat einige interessante Punkte. Er gibt reale Probleme, die er bei Kunden erlebt hat, die 50.000 Dateien für ein bestimmtes Muster einer Telefonnummer parsen müssen. Die Bewerber, die reguläre Ausdrücke kennen, reißen das Problem in ein paar Minuten durch, während diejenigen, die Monster-Mehrhundert-Zeilen-Programme schreiben, die sehr unhandlich sind. Dieser Artikel hat mich überzeugt, dass ich reguläre Ausdrücke lernen sollte.

    
Srikanth 06.02.2009 11:23
quelle
2

Keine brillante Antwort, aber überall, wo ich gearbeitet habe, gilt folgendes:

0 & lt; Anzahl der Personen, die Regex & lt; 1

Wenn ich wüsste, wie es geht, würde ich diesen vorherigen Ausdruck als Regex schreiben, aber ich kann nicht. Das Beste, was ich mir im Flug vorstellen konnte, ist s / voll / ein bisschen / g - das ist mein Limit (und das ist wahrscheinlich keine Regex).

Eine ernstere Antwort ist, dass die richtige Regex alle Arten von Problemen mit einer (ish) Codezeile lösen wird. Aber Sie werden echte Probleme haben, es zu debuggen, wenn es schief geht. Daher IMHO eine komplexe Regex aber "clean / clever" ist eine Haftung, wenn es zehn Zeilen Code benötigt, um es zu replizieren, warum ist das ein Problem, ist Speicher / Speicherplatz plötzlich wieder teuer?

Übrigens würde ich gerne wissen, ob Regexs im Vergleich zu Code-Äquivalenten schnell sind.

    
MrTelly 06.02.2009 11:25
quelle
2

Es ist nicht klar, welche Art von Antwort Sie erwarten.

Ich kann mir ungefähr drei Arten von Antworten auf diese Frage vorstellen:

  1. Regexen sind wichtig für die Ausbildung von professionellen Programmierern. Sie ermöglichen die Verwendung der leistungsstarken Unix-Shell-Tools, und Regex-basiertes Search-Replace kann die Text-Mungs-Arbeit, die ein Teil des Lebens eines Programmierers ist, drastisch reduzieren. Programmierer, die Regexen nicht kennen, sind nur intellektuell faul, was eine sehr schlechte Eigenschaft für einen Programmierer ist.

  2. Regexps sind abhängig von der Anwendungsdomäne. Sicherlich ist das Wissen, wie man Regexps schreibt, ein wertvolles Werkzeug für die Brust eines Programmierers, aber die meiste Zeit kann man es gut machen, ohne sie zu benutzen. Regexps sind auch sehr schwer zu lesen, daher muss dringend von Missbrauch abgeraten werden.

  3. Manche Verrückten setzen alles um (ich schaue dich an, der Perl-Typ, der ein Regex-basiertes Tetris in Perl implementiert hat). Aber wirklich, sie sind nur ein bisschen Informatik-Trivia, deren einzige praktische Verwendung in Parsern zu schreiben ist. Sie werden allgemein unterrichtet, weil sie ein gutes Lehrthema darstellen, um Schüler zu bewerten, und wie die meisten solcher Themen kann es das zweite vergessen, wenn Sie den Prüfungsraum verlassen.

Sie werden den sorgfältigen Gebrauch der Pluralformen "regexen" (pro), "regexps" (vorsichtig neutral) und "regexs" (con) bemerken.

Persönlich bin ich von der ersten Art. Gute Programmierer lernen gerne neue Sprachen und hassen repetitive Handarbeit.

    
ddaa 06.02.2009 11:28
quelle
2

Wenn Sie etwas parsen müssen (von einfachen Datumszeichenfolgen bis zu Programmiersprachen), sollten Sie wissen, dass Ihre Werkzeuge und regulären Ausdrücke eine davon sind.

Aber Sie sollten auch wissen, was Sie mit Regexes tun können und was nicht. An dieser Stelle ist es praktisch, wenn Sie die Chomsky-Hierarchie kennen Hierarchie. Andernfalls versuchen Sie am Ende, reguläre Ausdrücke zu verwenden, um kontextsensitive Sprachen zu parsen und fragen sich, warum Sie Ihre Regex nicht richtig verstehen können.

    
f3lix 06.02.2009 11:41
quelle
2

Die Tatsache, dass alle Sprachen reguläre Ausdrücke unterstützen, sollte etwas bedeuten!

    
Learning 06.02.2009 11:49
quelle
2

Ich denke, eine Regex zu kennen ist eine ziemlich wichtige Fähigkeit. Während die Verwendung von Regex in einer Programmierumgebung / Sprache eine Frage des wartbaren Codes ist, finde ich das Wissen von Regex nützlich mit einigen Befehlen (zB egrep), Editoren (vim, emacs etc.). Das Verwenden eines Regex zum Suchen und Ersetzen in vim ist sehr praktisch, wenn Sie eine Textdatei haben und gelegentlich Formatierungen durchführen möchten.

    
sateesh 06.02.2009 11:55
quelle
1

Ich finde es sehr nützlich, reguläre Ausdrücke zu kennen. Sie sind ein sehr mächtiges Werkzeug, und meiner Meinung nach gibt es Probleme, die Sie ohne diese einfach nicht lösen können.

Ich würde jedoch keine regulären Ausdrücke als Tötungskriterium für "Sie als Senior-Programmierer einstellen" verwenden. Sie sind wie der Reichtum anderer Werkzeuge in der Welt. Sie sollten sie wirklich in einer Problemdomäne kennen, in der Sie sie brauchen, aber Sie können nicht davon ausgehen, dass jemand diese bereits kennt.

  

"Ein Junior ist immer der Spielraum erlaubt   des Trainings "

Wenn ein Senior nicht ist, würde ich ihn nicht einstellen!

Zu denen, die argumentieren, wie komplex und unlesbar ein regulärer Ausdruck ist: Wenn die Regexp-Lösung für ein Problem komplex und unlesbar ist, dann ist das Problem wahrscheinlich! Viel Glück bei der Lösung auf andere Weise ...

    
chiccodoro 06.02.2009 11:56
quelle
0

Was macht das Folgende?

"([A-Za-z] [A-Za-z0-9 + .-] {1,120}: A-Za-z0-9 / {1,333} (# ([a-zA-Z0-9 ] [a-zA-Z0-9 $ _. +! *,; /?: @ & amp; ~ =% -] {0,1000}))?) "

Wie lange haben Sie gebraucht, um herauszufinden? debuggen?

Regexs sind großartig für Einweg-Wegwerfprogramme, aber lange haarige Regexps sind nicht die beste Wahl für Programme, die andere Leute über die Jahre pflegen müssen.

    
Jose M Vidal 06.02.2009 11:38
quelle
0

Ich finde, dass Regex sehr hilfreich sein kann, abhängig von der Art der Programmierung, die Sie tun. Allerdings schreibe ich wahrscheinlich weniger als eine Regex pro Monat, und wegen dieser langen Pause zwischen den Regex-Rezepten vergesse ich sehr, wie sie funktionieren.

Ich sollte wahrscheinlich irgendwann reguläre Ausdrücke oder etwas Ähnliches beherrschen.

    
JSmyth 09.02.2009 01:17
quelle
0

Es ist wichtig zu wissen, wann man eine Regexp verwenden und wie sie funktionieren und was ihre Grenzen sind. Aber deinen Kopf mit vielen Syntaxregeln zu füllen, die du wahrscheinlich nicht oft brauchst, ist nur eine sinnlose akademische Übung.

Ein regexp-Spickzettel kann auf ein Blatt A4-Papier oder ein paar Seiten in einem Lehrbuch geschrieben werden - Sie müssen dieses Zeug nicht auswendig kennen. Wenn Sie es täglich verwenden, bleibt es haften. Wenn Sie es nicht sehr oft verwenden, sind die Gehirnzellen wahrscheinlich besser für etwas anderes geeignet.

    
Noel Walters 09.02.2009 19:42
quelle
-1

Ein Entwickler dachte, er hätte ein Problem und versuchte es mit Regex zu lösen. Jetzt hat er 2 Probleme.

    
User 06.02.2009 11:23
quelle
-1

Ich stimme mit so ziemlich allem überein, was hier gesagt wurde, und muss nur den obligatorischen Quip enthalten:

  

Einige Leute, wenn sie mit einem konfrontiert werden   Problem, denke "Ich weiß, ich werde verwenden   reguläre Ausdrücke. "Jetzt haben sie   zwei Probleme.

(zurückzuführen auf Jamie Zawinski)

Wie die meisten Witze enthält es einen Kern der Wahrheit.

    
Evan 09.02.2009 18:00
quelle

Tags und Links