Wie lernst du reguläre Ausdrücke? [geschlossen]

80

Ich frage nicht, wo ich lernen soll. Ich habe viele gute Ressourcen online gefunden und Bücher usw.

Aber wie zum Teufel gehe ich mit ihnen um? Wo ist der Anfang, das Ende? Wann arbeitet der Regexp-Prozessor den Text weiter aus, wann hält er seinen Stand und versucht es mit einer anderen Übereinstimmung? usw.

Ich hätte Lust, Hieroglyphen auf den ägyptischen Pyramiden zu finden.

dumbBoy
quelle
2
Art des Themas - regular-expressions.info . Verwenden Sie diese und @ Jalayn Vorschlag unten. Lerne beim machen!
Freiheit
6
gskinner.com/RegExr ist das beste Tool zum Entwickeln von Regexs, das ich gefunden habe.
Callum Rogers
Stück für Stück. Beginnen Sie mit den einfachen Dingen ("aaa", "aa.", "A * b" usw.) und arbeiten Sie sich bis zu implementierungsspezifischen Komponenten (z. B. PCRE) vor. Überlegen Sie sich dann ein Muster und versuchen Sie, eine Regex zu erstellen, die dazu passt.
TylerL
Ich habe durch Ausprobieren mit dem tollen Programm RegexBuddy gelernt. regexbuddy.com (Ich bekomme keine Anerkennung für Werbung, dieses Programm machte es wirklich einfach zu lernen)
Yam Marcovic
rubular.com ist ein gutes Tool für die Entwicklung von Regexen.
Gazler

Antworten:

68

Ich denke, dass die Kenntnis der Automatentheorie für das Verständnis entscheidend ist.

Sobald Sie verstanden haben, was ein Automat ist und wie reguläre Sprachen definiert sind, wird das Verständnis der regulären Ausdrücke viel einfacher.

In Bezug auf die spezifische Syntax und die Unterschiede zwischen den verschiedenen Implementierungen ... Nun, einige Dinge müssen Sie sich nur merken. Auch dafür gibt es Hilfsmittel .

Bearbeiten

In einigen der folgenden Kommentare wurden wichtige Punkte angesprochen:

  1. Vergessen Sie nicht, dass reguläre Ausdrücke (wie sie in den meisten Programmiersprachen implementiert sind) eine Obermenge regulärer Ausdrücke in der Automatentheorie sind. Ein guter theoretischer Hintergrund ist zwar ein nützlicher Ausgangspunkt, sagt Ihnen aber nicht alles. (Danke, David Thornley)

  2. Mehrere Kommentatoren sagen, dass es möglich ist, die verschiedenen Regex-Syntax zu lernen, ohne die theoretischen Grundlagen zu erlernen. Während es stimmt, dass Sie Syntax lernen können, ohne vollständig zu verstehen, wie es funktioniert, war es mein Eindruck, dass das vollständige Verständnis das ist, wonach das OP strebt. Die Frage war nach der tatsächlichen Basis: Wann rückt der Prozessor vor? Wann hört es auf? Wie es entscheidet, dass es ein Match ist? Das ist die Basis, das ist die Theorie und sie basiert auf der Automatentheorie. Natürlich können Sie ein Auto fahren, ohne zu wissen, wie der Motor funktioniert. Aber wenn man Sie fragt, wie das Benzin tatsächlich zum Fahren bringt, müssen Sie darüber sprechen, wie der Motor gebaut ist, nicht wahr?

littleadv
quelle
Kommentatoren: Wenn Sie die Feinheiten dieser Frage diskutieren möchten, verwenden Sie bitte den Chat . Andernfalls sollten Sie eine Antwort hinterlassen oder über die Antworten abstimmen, die für Sie am zutreffendsten sind.
Danke für die Bearbeitung. Dies macht diese Antwort der Wahrheit viel näher. Obwohl ich immer noch nicht der Meinung bin, dass Sie die Automatentheorie wirklich kennen müssen (das weiß ich nicht, aber ich kann immer noch komplexe reguläre Ausdrücke schreiben), stimme ich zu, dass ein gewisses Wissen über die Theorie hilfreich sein könnte. Besonders das Wissen darüber, wie das Backtracking funktioniert und durch gierige / ungraue / besitzergreifende Quantifizierer gesteuert wird, kann Ihr Verständnis verbessern.
NikiC
Nur meine zwei Cent: In einer kürzlich erschienenen Videoserie über die C ++ STL-Regex-Bibliothek in MSDNs Channel 9 sagte der Presenter, der auch als Betreuer von STL fungiert, dass er diese als Automat implementiert. Das Wissen um diese Theorie sollte dem OP also einige Einblicke in die Funktionsweise von Regex geben.
korbes
5
Ich stimme der Eröffnungsrede überhaupt nicht zu. Als ich reguläre Ausdrücke lernte, wusste ich nichts über die Automatentheorie. Drei Jahrzehnte später weiß ich es immer noch nicht. Was ich wusste, war, wie man eine Manpage liest, wörtlich nimmt und wie man an einer Eingabeaufforderung experimentiert.
Bryan Oakley
1
@ Bryan gut ... Ihre Erfahrung irgendwie beweist den Punkt. Sie wissen vielleicht, wie man es benutzt, aber Sie verstehen nicht wirklich , wie es funktioniert. Wenn ja, dann wissen Sie etwas über die Automatentheorie, auch wenn Sie nicht wissen, wie Sie sie nennen sollen. Aber Sie können reguläre Ausdrücke nicht vollständig verstehen, ohne die Automatentheorie zu kennen, und es hilft Ihnen auch nicht viel, Manpages zu lesen (es sei denn, Sie lesen Manpages, in denen die Automatentheorie erklärt wird).
Littleadv
36

Durch das Üben.

Ich lernte, indem ich Spaß am Web Scraping hatte. Ich bin mir sicher, dass ich das nicht nur zum Spaß getan habe.

Ein Beispiel: Schreiben Sie einen Code, der die neuesten Fußball- und Tennisergebnisse (die Sportart, die Sie tatsächlich mögen) von Ihrer bevorzugten Sportwebsite abruft. Schreiben Sie dazu Code, um die Seite zu laden, extrahieren Sie die Partituren mit regulären Ausdrücken und geben Sie sie auf der Konsole oder in einer Textdatei aus. Stellen Sie sicher, dass Sie mit dem regulären Ausdruck, den Sie auswählen, nur die Ergebnisse abrufen und sonst nichts. Manchmal kann das eine ziemliche Herausforderung sein :-)

Zweites Beispiel: Schreiben Sie einen Code, der das Bild Ihres Lieblingswebcomics abruft (ich mag Sinfest zum Beispiel sehr) und der es irgendwo auf Ihrer Festplatte speichert. Verwenden Sie nur reguläre Ausdrücke, um das "img" -Tag und seinen Inhalt abzurufen. Optional kann der Titel auch abgerufen werden, wenn er irgendwo gespeichert ist.

Jalayn
quelle
15
Das Parsen von HTML mit regulären Ausdrücken ist im Allgemeinen eine schlechte Idee.
Maxpm
10
Natürlich ist es eine schlechte Idee. Die Verwendung von DOM / Sax-Parsern oder anderen dedizierten XML-Readern sollte "allgemein" verwendet werden. Aber hier geht es darum, reguläre Ausdrücke zu lernen, und ich erzählte, wie ich reguläre Ausdrücke auf eine Art und Weise lernte, die ich für "unterhaltsam" hielt.
Jalayn
3
Die Verwendung von XML-Parsern für HTML-Webseiten ist eine noch schlechtere Idee als das Scrappen mit regulären Ausdrücken.
Skolima
8
Na ja, ich wollte genauer sagen, was ich darüber dachte, aber ich war faul und reagierte nur auf den Kommentar ... Ich denke, wir sind uns alle einig, dass 1. die Verwendung regulärer Ausdrücke zum Parsen des gesamten Dokuments eine schlechte Idee ist 2. Verwenden von XML-Parsern zum Parsen von HTML ist eine schlechte Idee. 3. Verwenden von XML-Parsern zum Parsen von XHTML ist richtig. 4. Verwenden von regulären Ausdrücken zum Abrufen von Einzeilen oder einigen sehr spezifischen Informationen aus HTML ist richtig. Oder ich kann es einfach zusammenfassen: das richtige Werkzeug für den richtigen Job ...
Jalayn
23

Ich weiß, dass Sie nicht nach Ressourcen fragen, aber mit der Beherrschung regulärer Ausdrücke von Jeffrey EF Friedl habe ich gelernt, wie sie funktionieren und wie man sie verwendet. Selbst nachdem ich es verstanden hatte, viele davon zum Parsen verschiedener Dinge zu verwenden, hatte das erste Kapitel neue Dinge für mich.

Sie wollen diese verdammte Regexp verstehen? Lies dieses Buch.

Arkh
quelle
2
Dies sollte die endgültige Antwort sein.
schlank
1
+100.000 Eines der besten Fachbücher aller Zeiten und praktisch zum Thema der Frage.
Affe
Liebte dieses Buch. Das Wichtigste dabei war, dass ich die verschiedenen Funktionen von Regex besser verstehen konnte. Sie werden sich beim Lesen eines Buches nicht die gesamte Syntax merken können, aber das Buch zeigt Ihnen alle Dinge, die es gibt, damit Sie wissen, mit welchen Werkzeugen Sie ein Problem lösen können, wenn es auftritt.
Kibbee
Absolut +1 für diese Antwort. Ich stürzte mich auf Regex, bis ich mich endlich hinsetzte und diesen wichtigen Band Zeile für Zeile las. Jetzt hat Friedl mir genug von einer Grundlage gegeben, um mich durch all die vielen nicht-standardmäßigen Variationen, die uns heute quälen, zu schlüpfen! Ich kann diesen Verweis dem OP und allen anderen nur empfehlen. +1 an @slim für seinen Kommentar, auch!
John Tobler
19

Wo ist der Anfang, das Ende? Wann arbeitet der Regexp-Prozessor den Text weiter aus, wann hält er seinen Stand und versucht es mit einer anderen Übereinstimmung? usw.

Ich würde damit beginnen , Ihre Ziele zu klären und dann Ihren Lernstil herauszufinden .

Was mir an Ihrer Frage aufgefallen ist, ist die Frage: "Wie lerne ich reguläre Ausdrücke?" und stellen Sie anschließend sofort die Frage "Wie funktioniert die reguläre Ausdrucks-Engine intern?" Sie scheinen zu implizieren, dass diese beiden Dinge etwas miteinander zu tun haben, was bezeichnend ist. Vielleicht sind Sie eine Person, die lernt, wie etwas funktioniert, indem Sie es zerlegen oder selbst bauen.

Für Anfängeranwendungen ist es normalerweise nicht erforderlich, die Funktionsweise eines Werkzeugs zu verstehen, um es effektiv zu nutzen. Sie müssen nicht wissen, wie ein Bohrmotor funktioniert, um Löcher in Holz zu bohren. Sie müssen verstehen, wie man den Bohrer benutzt, und nicht, wie man einen Bohrer baut .

Also, was ist dein Ziel? Möchten Sie lernen, wie Sie ein Modul für reguläre Ausdrücke erstellen? Oder möchten Sie lernen, wie Sie reguläre Ausdrücke effektiv zum Lösen von Geschäftsproblemen verwenden können? Das Erreichen dieser unterschiedlichen Ziele erfordert wahrscheinlich unterschiedliche Lerntechniken.

Um Ihre spezifische Frage zu beantworten, wie das Modul für reguläre Ausdrücke funktioniert: Es kommt darauf an. Der "klassische" theoretische Ansatz für reguläre Ausdrücke besteht darin, den regulären Ausdruck als Entwurf für einen nicht deterministischen endlichen Automaten zu verwenden, dann den entsprechenden deterministischen endlichen Automaten zu erstellen und diesen Automaten dann gegen die Eingabe auszuführen.

Fast niemand tut dies tatsächlich aus mehreren Gründen. Erstens ergibt die Anzahl der Zustände multipliziert mit der Anzahl der möglichen Eingabezeichen eine Zustandsübergangstabelle, die selbst für kleine reguläre Ausdrücke enorm ist. Sicher, das meiste davon kann komprimiert werden, aber es gibt immer noch viele Übergangsregeln. Zweitens sind andere Ansätze normalerweise schneller. Drittens sind sogenannte "reguläre" Ausdrücke in modernen Regexp-Bibliotheken nichts dergleichen. Sie sind überhaupt keine regulären Sprachen; Sie werden oft von Pushdown-Automaten erkannt, nicht von endlichen Automatensprachen.

(Ich habe angefangen, eine lange Reihe darüber zu schreiben, wie all das funktioniert, aber erst nach den ersten zwölf Artikeln ist mir der Dampf ausgegangen . Vielleicht finden Sie sie interessant, wenn Sie eine kurze Einführung in den theoretischen Hintergrund grundlegender regulärer Ausdrücke wünschen.)

Echte reguläre Ausdrucksmodule verwenden stattdessen normalerweise eine Backtracking-Strategie. Die reguläre Ausdrucks-Engine, die wir vor über einem Jahrzehnt für die JScript-Engine erstellt haben, kompiliert den regulären Ausdruck jetzt in eine Bytecode-Sprache, die Grundelemente zum Erkennen von Sequenzen und zum Zurückverfolgen zu früheren Zuständen enthält. Wir haben dann einen Interpreter für diese Bytecode-Sprache erstellt.

Ich würde nicht versuchen zu verstehen, wie eine reguläre Ausdrücke- Engine funktioniert, bevor ich nicht genau weiß, wie man reguläre Ausdrücke verwendet. Konzentrieren Sie sich darauf, bevor Sie sich mit den Optimierungsstrategien verschiedener Motoren befassen.

Eric Lippert
quelle
+1, weil Sie verschiedene Dinge ansprechen, die bei der Verwendung von regulären Ausdrücken zu beachten sind. Ich bin jedoch nicht der Meinung, dass es nicht notwendig ist, das Innere zu kennen. Zum Bohren haben Sie vollkommen recht. Bei Computern habe ich festgestellt, dass ich früher als zunächst angenommen den Punkt erreicht habe, an dem ich das Innere eines Elements verstehen muss, um dessen Anwendung zu beherrschen - sei es C ++ (Compiler), Webserver (HTTP) oder reguläre Ausdrücke (Automatentheorie). . Nicht bis zu dem Punkt, an dem ich Experte werde, aber ein gutes Verständnis der zugrunde liegenden Prinzipien ist oft der schnellste Weg zu lernen.
Felix Dombek
3
@Felix: Ich denke, wir sind uns tatsächlich einig. Ich sagte , dass für Anfänger Anwendungen gibt es in der Regel nicht notwendig , zu verstehen , wie ein Werkzeug funktioniert , um es zu benutzen. Diese Wieselworte waren absichtlich. Für die fachkundige oder meisterhafte Verwendung eines Werkzeugs ist es sehr hilfreich, zumindest etwas über seine internen Komponenten zu verstehen, damit Sie genau vorhersagen können, wo das Werkzeug beispielsweise eine schlechte Leistung aufweist.
Eric Lippert
Hmm, ich müsste etwas widersprechen. Einige der nützlichsten Business-Programme, die ich erstellt habe, haben die in lexx und yacc erlernte Theorie verwendet, um Probleme effizient zu lösen. Sie haben jedoch Recht, ein vollständiges Verständnis der Doktorarbeit ist nicht erforderlich. Ich muss die Blogposts lesen, sie sehen am interessantesten aus.
Spencer Rathbun
Sie sagen , dass reguläre Ausdrücke nicht regelmäßig sind - aber ich dachte , die Welt regelmäßig im Namen der Ausdrücke bezog es passt - zum Beispiel den regulären Ausdruck , "[0-9]{3}"die jede dreistellige Zahl entsprechen können, und die dreistellige Zahl 480 ist ein Beispiel für eine regelmäßige Ausdrücke, denen es entspricht.
Konfigurator
1
@configurator: Eine "reguläre" Sprache ist per Definition eine Sprache, die von einem endlichen Automaten erkannt werden kann. Jede reguläre Sprache kann durch einen "regulären Ausdruck" charakterisiert werden, der nur aus Gewerkschaften, Alternativen, Verkettungen und dem Kleene-Stern besteht. Aber die meisten "regulären Ausdrücke" erkennen heutzutage komplexere Sprachen als reguläre Sprachen. Beispielsweise ist die Sprache von "Sätzen mit korrekt übereinstimmenden Klammern" nicht regulär, aber Sie können sie in einigen regulären Ausdrucksmodulen mit einem "regulären Ausdruck" abgleichen.
Eric Lippert
6

Wie zum Teufel gehe ich mit ihnen um?

Wie alles Neue:

10 Study
20 Practice
30 goto 10

Studie

Ich stelle fest, dass die meisten erfolgreichen Lehrer mit dem Unterrichten eines Fachs beginnen, indem sie zunächst ein wenig Hintergrundwissen zum Fach vermitteln. Es ist wichtig, einen Kontext dafür zu haben, was Sie lernen und vor allem, warum Sie es lernen.

Es ist alles String Matching

Reguläre Ausdrücke dienen dazu, Muster im Text abzugleichen. Es ist eine deklarative Sprache, die in zahlreiche andere Programmiersprachen integriert ist.

Ich möchte betonen, dass es sich um eine deklarative Sprache handelt. Reguläre Ausdrücke sind nützlich, um auszudrücken, welche Zeichenfolge abgeglichen werden soll, sie drücken jedoch in keiner Weise aus, wie das Programm den Abgleich durchführen soll. Aus diesem Grund ist es möglich, reguläre Ausdrücke sehr schnell und sehr langsam in derselben Programmiersprache zu verwenden, indem einfach ein anderer RegEx-Parser verwendet wird.

Der Grund für die Erstellung regulärer Ausdrücke ist der gleiche wie für die Erstellung der meisten Programmiersprachen: Programmierer mussten immer wieder dieselbe komplizierte Aufgabe ausführen und entschieden sich für eine einfachere Art, den Code zu schreiben.

Einige werden (und sollten) sich über meinen vorherigen Satz beklagen, indem sie etwas in der Art von:

RegEx macht ein Programm nicht einfacher.

das ist wahr

RegEx macht ein Programm nicht einfacher, RegEx vereinfacht das Schreiben des Programms. Sie müssen Ihre Tests noch gründlich durchführen, um sicherzustellen, dass alle korrekten Fälle korrekt zugeordnet sind, und alle inkorrekten Fälle nicht. Es ist wirklich schwer, "alle" zu testen, und bei komplizierten Mustern ist es wirklich schwer, "die meisten" zu testen. Im schlimmsten Fall sollten Sie immer noch "einige" Fälle testen.

Lassen Sie uns einige Beispiele einbeziehen. Ich habe mich obligatorisch für die RegEx-Engine von JavaScript entschieden, da ich sie problemlos live im Browser testen kann und bei der Verwendung von RegEx-Literalen kein String-Escape durchführen muss.

Wenn Sie einen normalen String-Abgleich durchführen, testen Sie einen String-Wert gegen einen anderen. Sie können von überall her kommen, aber am Ende müssen zwei Zeichenfolgen miteinander verglichen werden:

if ( 'foo' == 'bar' ) doSomething();

Dieses Beispiel ist zum Kotzen, weil es niemals etwas bewirken wird

if ( foo == 'bar' ) doSomething();

Viel besser; Jetzt wissen wir nicht im Voraus, ob etwas getan wird oder nicht. Wir können jetzt damit beginnen, Benutzereingaben zu akzeptieren:

if ( prompt( 'Say "bar" to do something.' ) == 'bar' ) doSomething();

Wunderbar, jetzt können Benutzer Eingaben machen barund etwas wird passieren, bis Sie Fehlerberichte von Benutzern erhalten, die sagen, dass "bar"das nicht funktioniert, oder dass "BAR" nicht funktioniert, oder dass sie BRA100-mal getippt haben und nie etwas passiert.

Wenn Sie die Rechtschreibfehler und zusätzlichen Zeichen ignorieren 'bar' != 'BAR'und Programmierer überlegen, wo Zeichen falsch geschrieben sind.

Einfache Lösung, verwenden toLowerCase. Das funktioniert wunderbar, aber was ist mit unseren Nutzern, die britisches Englisch anstelle von amerikanischem Englisch verwenden, wenn Sie übereinstimmen something == 'color'? Jetzt musst du passen something == 'color' || somthing == 'colour'.

Lange Rede, kurze, einfache Muster verwandeln sich sehr schnell in viele sich wiederholende Codes.

Das Farbbeispiel kann einfach angepasst werden mit:

/colou?r/.test( something )

Ein solides Verständnis der Grundlagen regulärer Ausdrücke kann die Zeit, die Sie für die Neuerfindung des Rads benötigen, erheblich verkürzen.

Wo soll ich studieren

Die meisten Sprachen, die reguläre Ausdrücke implementieren, verfügen über mindestens eine Ressource für die spezifische Syntax der Verwendung regulärer Ausdrücke in dieser Sprache. Eine für JavaScript finden Sie im MDN

Lies es.
alles davon.
dann lies es nochmal.

Das Erlernen nimmt Zeit in Anspruch und ist eine Investition: Eine Stunde für das Erlernen von RegEx spart jetzt eine Stunde für den nächsten String-Pattern-Abgleich und eine weitere Stunde für den nächsten.

Trainieren

Nachdem Sie alles über RegEx gelesen haben, werden Sie wahrscheinlich das meiste davon nicht verstehen. Das ist , weil du nicht wirklich tun , damit nichts.

Ich habe erwähnt, warum ich JS für dieses Beispiel gewählt habe. Ich fordere Sie dringend auf, damit in Ihrem Browser herumzuspielen. Es ist schnell und Sie können es direkt in Ihrer URL-Leiste tun.

JS bietet verschiedene und einfache Möglichkeiten zur Verwendung von RegEx:

string.match( regex )
regex.exec( string )
regex.test( string )

Beginnen Sie mit etwas Einfachem wie:

javascript:'color'.match(/colou?r/);

ist eine einfache Möglichkeit, Ihren Fuß in die Tür zu bekommen. Spielen Sie damit, brechen Sie es und sehen Sie, welche Übereinstimmungen vorhanden sind und welche nicht.

Wenn Sie nicht weiterkommen, fahren Sie fort 30. Sie müssen lesen, um mehr zu lernen, aber Sie müssen üben, um wirklich zu verstehen, was Sie gelernt haben.

zzzzBov
quelle
+1 für die Empfehlung, JavaScript im Browser zu verwenden.
John Tobler
5

Brian Kernighan schreibt einen einfachen Reg-Ex-Prozessor in das Buch Beautiful Code . Mir ist klar, dass Sie nicht nach Ressourcen suchen, aber es könnte hilfreich sein, eine grundlegende Implementierung im Inneren zu sehen.

Michael Easter
quelle
Der erwähnte "Regex-Prozessor" implementiert eigentlich keine Disjunktionen, und mit dem gegebenen Ansatz ist es sehr schwierig, sie hinzuzufügen. Ich mag das Buch, aber das ist eine Sache, von der ich enttäuscht war.
Felix Dombek
4

In der normalen Entwicklung kann das Debuggen von Code sehr nützliche Erkenntnisse liefern. Reguläre Ausdrücke sind nicht anders. Wenn Sie also Gefahr laufen, wie eine Werbung zu klingen , sollten Sie sich RegexBuddy zulegen . Es verfügt über ein großartiges Tool, mit dem Sie visuell anzeigen können, was die Engine tut, während sie Ihren Ausdruck und die Eingabezeichenfolge verarbeitet.

John Fisher
quelle
1
+1, "Regex Hero" ist auch nett: regexhero.net/tester
Angelo
Regexbuddy ist eines meiner Lieblingswerkzeuge. Das Anzeigen der Baumansicht ist unglaublich hilfreich, da Sie diese sofort testen können, während Sie Ihren regulären Ausdruck generieren. Ich habe viel mehr Regex gelernt, ohne zu versuchen, es zu lernen, indem ich es einfach benutze.
Chao
1
Ich fand RegexBuddy immer interessant, aber ich mag es nicht, es kaufen zu müssen. Für grundlegende Regex-Tests gibt es viele andere Dienstprogramme. Zum Anzeigen einer textuellen Beschreibung des regulären Ausdrucks gibt es jedoch weniger Tools. Regex Heros kostenpflichtige Version macht es auch. Eine Sache, die für RegexBuddy ziemlich einzigartig ist, ist der Regex-Debugger, der jede Annahme oder Ablehnung eines Zeichens und jeden Backtrack in exkrutierenden Details anzeigt, was beim Debuggen eines großen und sehr komplizierten Regex wirklich hilfreich sein kann. Ich habe kein anderes Tool bemerkt, das das macht.
Kevin Cathcart
3

Reguläre Ausdrücke können sehr schnell sehr kompliziert werden. Daher würde ich empfehlen, dass Sie sie mithilfe von Lernprogrammen lernen. Wissen Sie, dass die einfachste Form des regulären Ausdrucks eine Zeichenfolge ist, die darstellt, wonach Sie suchen. Um spezielle Suchregeln definieren zu können, sind leider bestimmte Zeichen erforderlich. Diese Zeichen müssen maskiert werden, oder Sie erstellen einen ungültigen oder falschen regulären Ausdruck.

Mein Rat ist, mit einem Beispiel für etwas zu beginnen, nach dem Sie suchen, und es zu umgehen. Wenn Sie also nach etwas in Klammern suchen, nehmen Sie ein Beispiel für eine solche Zeichenfolge in dem Text, in dem Sie suchen: (this is an example of something you'd want to find)

Beginnen Sie, indem Sie die Zeichen maskieren, damit Sie nach dem Literal suchen: \(this is an example of something you'd want to find\)

Testen Sie es und vergewissern Sie sich, dass es Ihr Beispiel korrekt findet. Verallgemeinern Sie dann den Ausdruck, um einen solchen Text zu finden, nicht nur das Beispiel, das Sie gefunden haben. So würde es dann werden: \([^)]*\) (bedeutet jedes Zeichen, das nicht ")" ist, für eine beliebige Anzahl von Vorkommen, einschließlich 0).

Testen Sie es erneut und vergewissern Sie sich, dass es nicht nur Ihr Beispiel findet, sondern es auch anderen gefällt. Suchen Sie im Internet nach komplizierteren, aber häufigeren regulären Ausdrücken und patchen Sie sie mit Ihren vorhandenen regulären Ausdrücken, um nicht über jede einzelne Möglichkeit nachdenken zu müssen.

Das ist alles. Und oh, lerne und liebe \ Q ... \ E. In den meisten regulären Ausdruckssprachen steht \ Q für den Anfang eines wörtlichen Musters und \ E für das Ende, falls Sie nach besonders ausgefeilten Mustern suchen müssen und nicht wissen, wie Sie sie umgehen können. Das hat mir mehr als ein paar Male das Leben gerettet.

Neil
quelle
3

Ich gebe Ihnen eine einfache Antwort auf eine einfache Frage. Zunächst müssen Sie verstehen, was reguläre Ausdrücke (RegEx) sind - was sie tun, wofür sie verwendet werden. Dann ist es ein großartiges Tool, um loszulegen.

  1. Was ist es? RegEx ist eine Sprache zum Ausdrucken von Mustererkennung. Das heißt, Sie können damit eine Zeichenkombination erstellen, die Muster im Text erkennt oder findet. Wie ist das nützlich? Bei der Programmierung können Sie Computern anweisen, Text aus einer bestimmten Quelle (Benutzereingabe, Webseite usw.) abzugleichen und festzustellen, ob bestimmte Textmuster enthalten sind. Ein Punkt (.) Steht beispielsweise für ein beliebiges Zeichen - einen Buchstaben oder eine Zahl. Zahlen in geschweiften Klammern stehen für die Anzahl der Iterationen. ". {1,30}" gibt also ein beliebiges Zeichen an, das ein- bis dreissig Mal wiederholt wird. Mit anderen Worten, Sie können keine leere Zeichenfolge verwenden und sie darf nicht länger als 30 sein Figuren. Und von da an geht es weiter.

  2. Wie fange ich an zu lernen? Das absolut beste Tool, das ich gesehen habe, ist Expresso , aber es ist nur für Windows. Es hat eine sehr umfangreiche Benutzeroberfläche, in der Sie durch die Elemente klicken, die Sie zu Ihrem Ausdruck hinzufügen möchten, und anschließend einen Tester, um die Ergebnisse anhand verschiedener Eingaben zu überprüfen. Ich habe auf dem Mac nichts Gutes gesehen (aber ich verwende Windows unter VMWare, brauche also eigentlich keine Mac-Version) und habe nicht viel Zeit mit Linux verbracht.

Jay Imerman
quelle
1
Danke für den Tipp zu Expresso. Ich habe es ausprobiert und es ist großartig!
Jim In Texas
3

Sie lernen nicht nur gut, sondern auch, indem Sie gute Lernwerkzeuge verwenden. Einer verwendet den Open-Source- Vim- Editor mit zwei festgelegten Optionen:

  1. : set incsearch ... Wenn Sie in der Befehlszeile ein Suchmuster eingeben, springt der Editor direkt zum ersten übereinstimmenden Text und hebt genau das hervor, was übereinstimmt. Wenn Sie etwas eingeben, das nicht mehr mit irgendetwas übereinstimmt, springt Vim mit dem Cursor dorthin zurück, wo Sie zu Beginn waren.
  2. : set hlsearch ... dies weist Vim an, einen hervorgehobenen Hintergrund für den gesamten Text anzuzeigen, der mit der aktuellen RE-Suche übereinstimmt.

Die andere Möglichkeit besteht darin, ein kostenloses Tool namens RegExCoach zu verwenden . Sie fügen den zu durchsuchenden Text ein und entwickeln dann in einem anderen Fenster Ihren regulären Ausdruck. Wie Vim werden erfolgreiche Spiele im Handumdrehen hervorgehoben.

Firstrock
quelle
RegExCoach ist jetzt Shareware. Ich fand es sehr hilfreich bei der Entwicklung komplexer REs im Perl-Stil.
Firstrock
2

Sie beginnen mit einem einfachen Zeichenfolgenvergleich. Sehr einfach, aber auch nicht so mächtig.

Als nächstes könnte es Ihnen vorgekommen sein, dass Sie Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung benötigen, damit "Griechisch" und "Griechisch" gleich sind. Das ist etwas mächtiger.

Ein Tag, an dem Sie kleine Unterschiede in der Rechtschreibung bemerken, sollte nicht verhindern, dass 2 Wörter gleich sind: dh "organisieren" und "organisieren" sollten gleich sind. Sie setzen sich und schreiben einen Code, der dies tut und Sie sind glücklich.

Bis Sie ein bisschen mehr abstrahieren und feststellen, dass Sie manchmal alle Wörter, die mit "ize" enden, mit ihren Brüdern in britischer Schreibweise vergleichen möchten. Oder Wiederholungen einiger Saiten eine bestimmte Anzahl von Malen. Und natürlich müssen Sie all das kombinieren.

Und so weiter. Schließlich werden Sie höchstwahrscheinlich eine Notation finden, in der nicht jedes Zeichen für sich selbst steht. Nichts anderes ist ein regulärer Ausdruck. Man kann es als Beschreibung einer Reihe von Zeichenketten sehen.

Und dann ist es ziemlich einfach und beruht auf den folgenden drei Grundprinzipien:

Sie haben grundlegende reguläre Ausdrücke: Zeichen, die für sich selbst stehen, Zeichenklassen, handliche und weniger handliche Abkürzungen für Zeichenklassen wie \ d oder \ p {Lu} für Großbuchstaben.

Und dann haben Sie einige Möglichkeiten, sie zu kombinieren: Wenn r1 und r2 reguläre Ausdrücke sind, dann sind dies auch r1r2 r1 | r2 (r1).

Zu guter Letzt die Wiederholungsmodifikatoren: r? r * r + r {n, m}

Dies ist das Wichtigste, was Sie wissen müssen. Alles andere können Sie nachschlagen, wenn Sie es brauchen.

Ingo
quelle
2

In zwei weiteren guten Antworten lernen Sie die Theorie hinter regulären Ausdrücken und üben sie aus, was beides gute Ratschläge sind. Ich würde auch empfehlen, ein gutes visuelles Regex-Tool zu kaufen, um Ihnen zu helfen, wenn Sie es ernst meinen.

RegexBuddy verfügt beispielsweise über einen visuellen Debug-Modus, mit dem Sie Schritt für Schritt durch die Ausführung eines Regex führen und anhand von Markierungen und erklärendem Text anzeigen können, was die Regex-Engine bei jedem Schritt tut. Es gibt ein Video, das dieses Debuggen auf ihrer Site demonstriert .

Steven
quelle
2

Alles, was wir Ihnen geben können, ist mehr Ressourcen zum Lernen. Diese Frage ist selbst eine Ressource.

Übrigens habe ich reguläre Ausdrücke von dieser Seite ziemlich leicht gelernt: http://www.regular-expressions.info/

Thiago Negri
quelle
1

Für mich ist es sehr hilfreich, wenn ich sehe, wie die regulären Ausdrücke beim Bauen zusammenpassen, was mir das Leben erleichtert und mir geholfen hat, sie besser zu verstehen.

Dazu öffne ich in Emacs eine Datei mit dem Zieltext und verwende dann den isearch-forward-regexpBefehl. Wenn Sie den regulären Ausdruck eingeben, zeigt Ihnen Emacs, was damit übereinstimmt (das ist der "isearch" -Teil).

Um den Befehl auszuführen, können Sie in Emacs verwenden <ESC>xisearch-forward-regexp.

jwernerny
quelle
1

Ich habe reguläre Ausdrücke gelernt, indem ich Flex und Bison gelernt habe, mit denen lexikalische Analysatoren und Parser erstellt werden. Sie könnten keinen Parser ohne reguläre Ausdrücke haben, und das Buch lexx und yacc ist unglaublich gut darin, durch die Theorie zu gehen, ohne sich zu schnell zu bewegen.

Grundsätzlich folgen heutzutage praktisch alle Regex-Engines denselben Prinzipien. Sie sind alle Finite-State-Maschinen, und wenn Sie das wirklich verstehen, dann haben Sie ein Bein oben auf fast jedem Code, den Sie schreiben. Es ähnelt dem Erlernen von Rekursion, wenn Sie es einmal erhalten haben, wenden Sie es instinktiv auf Probleme an. Sie sind leicht mit dem richtigen Werkzeug zu lösen, aber ohne es sehr schwer.

Eine andere Sache beim Lernen von Lexx und Yacc im Vergleich zu regulären Ausdrücken ist, dass Sie lernen, wie sie intern funktionieren . Wie das Programm in die Zukunft schaut, warum es ein Match beendet, wie es die Daten enthält und vieles mehr. Das Verstehen von Zeigern ist ein absolutes Muss, aber wenn Sie Lexx und Yacc lernen und es von Anfang an durcharbeiten, lernen Sie alles, was Sie gefragt haben, und haben ein enorm leistungsfähiges Werkzeug für den Rest Ihrer Karriere.

Diese Frage beinhaltet eine Reihe von Lernressourcen und ein flexibles Skelett, das ich zusammengestellt habe.

Spencer Rathbun
quelle
1

Außerdem versuche ich zunächst sicherzustellen, dass es keinen einfacheren Weg gibt, das Problem zu lösen / den String zu "tokenisieren".

Wenn Sie keine finden, sehe ich es als ein Problem, nicht zu versuchen, das zu finden, was Sie wollen, sondern NICHT das, was Sie nicht wollen. Dies liegt hauptsächlich daran, dass Regex gierig sind. Aber es hat mir gute Dienste geleistet, um das zu bekommen, was ich will.

Hier ist ein Beispiel:

string = "Sep 22 19:57:38 host fcron[9137]: \
          Job fbsetbg -r $HOME/backgrounds/ \
          started for user user (pid 9138)"

passend zur Minute:

string.match /^\w+\s\d+\s\d+:(\d+):\d+\s\w+\s/ # correct but bad
string.match /\d+:([^:]+):\d+/                 # correct and good

Anstatt zu versuchen, die Zeit zusammen mit allem anderen zu finden, versuchen Sie, die verschiedenen Grenzen zu finden.

Das Beispiel ist ein bisschen erfunden, aber alles, was ich mir einfallen lassen konnte.

frogstarr78
quelle
1

Ein Ansatz, den ich gewählt habe, war, eine Reihe von Open-Source-Projekten zu finden, für die Syntaxaktualisierungen erforderlich waren, und dann ein zunehmend komplexeres sed-Skript zu schreiben, das aus vielen regulären Ausdrücken bestand.

Das Skript musste für viele verschiedene Dateien in jedem Open Source-Projekt ausgeführt werden. Dann werden Sie mit vielen verschiedenen Projekten mit unterschiedlichen Stilen konfrontiert. Ich habe mit etwas sehr Einfachem angefangen, als %s/before/after ich feststellte, dass es zu vielen Fällen passte. Also habe ich mehr hinzugefügt, um das zu verhindern. Dann fand ich verschiedene Projekte mit unterschiedlichen Syntaxstilen, die unterschiedliche Änderungen erforderten.

Am Ende bin ich mit gelandet

  • große Fähigkeiten und Kenntnisse über reguläre Ausdrücke
  • gute Fähigkeiten mit sed
  • Unterstützung bei vielen Open Source-Projekten
  • Auf meinem Github-Profil wird eine Menge Beitragsaktivität angezeigt
  • Ein weiteres gutes Schweizer Taschenmesser für den virtuellen Werkzeuggürtel

und wurde bei diesem Ansatz durch die Notwendigkeit geholfen

  • Erreiche deine Ziele ohne zu schummeln
  • Verwenden Sie die (regulären) Fähigkeiten als Teil eines größeren Ziels mit größerer Motivation.
  • in der Lage sein, Beweise für die Fähigkeiten vorzulegen, die ich erlernt habe, indem ich den Code anderer geändert und dann die Änderungen überprüfen ließ.

Ich werde auch weitergeben, dass es eine Reihe von Websites für die verschiedenen Sprachen gibt - Ruby, Javascript usw., mit denen Sie mit Ausdrücken und Beispieltexten herumspielen können, um sie sofort zu befriedigen. Diese sind:

Regexes in mehreren Sprachen auf einer Website

Konzentrieren Sie sich auf die Spielgruppen:

Michael Durrant
quelle
0

Ich habe festgestellt, dass man reguläre Ausdrücke lernt, ähnlich wie man die Multiplikationstabellen lernt - ja, man muss die Ideen dahinter verstehen, aber letztendlich muss man es nur oft und wiederholt tun.

Als ich lernte, setzte ich mir das Ziel, ein paar Regex-Übungen pro Tag zu machen. In der Praxis bedeutete dies, dass ich mindestens einmal am Tag versuchte, eine Zeichenfolge oder einen Text auf meinem Bildschirm zu sehen und eine Herausforderung zu finden: "Kann ich alle E-Mail-Adressen hier rausholen" oder "Alle finden" Vorkommen des Wortes "Code", das als Verb und nicht als Substantiv verwendet wird.

Dies für ein paar Wochen zu tun, hat sich wirklich gelohnt - und natürlich sind regelmäßige Überprüfungen und Auffrischungen erforderlich. Ich bin für einen fällig.

Ich fand dieses Online-Tool auch hilfreich, da es mich Regex in Echtzeit testen lässt: http://www.gethifi.com/tools/regex

Philip Schweiger
quelle