it-swarm.dev

Wie lernst du reguläre Ausdrücke?

Ich frage nicht wo zu lernen. Ich habe viele gute Online-Ressourcen und Bücher usw. gefunden.

Aber wie zum Teufel gehe ich sie an? Wo ist der Anfang davon, das Ende? Wann rückt der Regexp-Prozessor auf den Text vor, wann hält er seinen Stand und versucht ein anderes Match? usw.

Ich möchte versuchen, Hieroglyphen auf den ägyptischen Pyramiden herauszufinden.

81
dumbBoy

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 es viel einfacher sein, reguläre Ausdrücke zu verstehen.

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

Bearbeiten

Einige der folgenden Kommentare haben wichtige Punkte aufgeworfen:

  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 lernen. Es ist zwar richtig, dass Sie Syntax lernen können, ohne vollständig zu verstehen, wie es funktioniert, aber ich hatte den 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 entscheidet es, 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 Sie gefragt werden, "wie das Gas es tatsächlich zum Fahren bringt", müssen Sie darüber sprechen, wie der Motor gebaut ist, nicht Sie?

68
littleadv

Durch das Üben.

Ich habe gelernt, indem ich Spaß am Web-Scraping hatte. Ich bin mir sicher, dass ich das nicht nur zum Spaß alleine gemacht habe.

Ein Beispiel: Schreiben Sie einen Code, der die neuesten Ergebnisse für Fußball und Tennis (die Sportart, die Sie tatsächlich mögen) von Ihrer Lieblingssport-Website abruft. Schreiben Sie dazu Code, um die Seite zu laden, extrahieren Sie die Partituren mit regulären Ausdrücken und geben Sie sie an die Konsole oder in eine Textdatei aus. Stellen Sie sicher, dass Sie mit dem von Ihnen ausgewählten regulären Ausdruck nur die Partituren abrufen und sonst nichts. Manchmal kann das ziemlich herausfordernd sein :-)

Zweites Beispiel: Schreiben Sie einen Code, der das Bild Ihres Lieblings-Webcomics 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 können Sie auch den Titel abrufen, wenn er irgendwo gespeichert ist.

36
Jalayn

Ich weiß, dass Sie nicht nach Ressourcen fragen, sondern Mastering Regular Expressions von Jeffrey E. F. Friedl hat gelernt, wie sie funktionieren und wie man sie verwendet. Selbst nachdem ich so weit gekommen war, viele davon zum Parsen verschiedener Dinge zu verwenden, hatte das erste Kapitel neue Dinge für mich.

Du willst diese verdammten Regexp verstehen? Lies dieses Buch.

23
Arkh

Wo ist der Anfang davon, das Ende? Wann rückt der Regexp-Prozessor auf den Text vor, wann hält er seinen Stand und versucht ein anderes Match? usw.

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

Was mich an Ihrer Frage beeindruckt hat, ist, dass Sie fragen: "Wie lerne ich reguläre Ausdrücke?" und dann sofort mit der Frage "Wie funktioniert die reguläre Ausdrucks-Engine intern?" Sie scheinen zu implizieren, dass diese beiden Dinge etwas miteinander zu tun haben, was ein aussagekräftiger Punkt ist. Vielleicht sind Sie eine Person, die lernt, wie etwas funktioniert, indem sie es zerlegt oder selbst baut.

Für Anfängeranwendungen ist es normalerweise nicht erforderlich zu verstehen, wie ein Tool funktioniert, um es effektiv zu verwenden. Sie müssen nicht wissen, wie ein Bohrmotor funktioniert, um Löcher in Holz zu bohren. Sie müssen verstehen, wie man verwendet den Drill, nicht wie man baut einen Drill.

Was ist dein Ziel? Wollen Sie lernen, wie man eine Engine für reguläre Ausdrücke erstellt ? Oder möchten Sie lernen, wie man reguläre Ausdrücke effektiv verwendet, um geschäftliche Probleme zu lösen ? Erreichen Sie diese Unterschiedliche Ziele erfordern wahrscheinlich unterschiedliche Lerntechniken.

Um Ihre spezifische Frage zur Funktionsweise der Engine für reguläre Ausdrücke zu beantworten: Es kommt darauf an. Der "klassische" theoretische Ansatz für reguläre Ausdrücke besteht darin, den regulären Ausdruck als Blaupause für einen nichtdeterministischen endlichen Automaten zu verwenden, dann den äquivalenten 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 trotzdem 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 häufig von Pushdown-Automaten erkannt, nicht von endlichen Automaten-Sprachen.

(Ich habe angefangen, eine lange Serie darüber zu schreiben, wie all dieses Zeug funktioniert, aber mir ging erst nach dem die ersten zwölf Artikel der Dampf aus. Vielleicht finden Sie sie interessant, wenn Sie eine kurze Einführung in den theoretischen Hintergrund von möchten grundlegende reguläre Ausdrücke.)

Echte Engines für reguläre Ausdrücke verwenden normalerweise eine Backtracking-Strategie. Die Engine für reguläre Ausdrücke, 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 Regexp-Engine funktioniert, bevor ich ein ziemlich solides Verständnis dafür habe, wie man reguläre Ausdrücke verwendet. Konzentrieren Sie sich darauf, bevor Sie sich mit den Optimierungsstrategien verschiedener Motoren befassen.

19
Eric Lippert

Wie zum Teufel gehe ich damit um?

Wie jede neue Sache:

10 Study
20 Practice
30 goto 10

Studie

Ich finde, dass die meisten erfolgreichen Lehrer anfangen, ein Fach zu unterrichten, indem sie zuerst ein wenig Hintergrundwissen zum Fach liefern. Es ist wichtig, einen Kontext zu haben, in dem Sie lernen, und vor allem , warum Sie es lernen.

Es ist alles String-Matching

Reguläre Ausdrücke sind ein Mittel zum Abgleichen von Mustern im Text. Es ist eine deklarative Sprache selbst, 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 übereinstimmt, aber sie drücken in keiner Weise aus. Wie soll das Programm den Abgleich durchführen? 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 für die Erstellung der meisten Programmiersprachen: Programmierer haben immer wieder dieselbe komplizierte Aufgabe ausgeführt und beschlossen, den Code einfacher zu schreiben.

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

RegEx macht ein Programm nicht einfacher.

es ist wahr

RegEx macht ein Programm nicht einfacher, RegEx macht das Schreiben des Programm einfacher. Sie müssen Ihre Tests noch gründlich durchführen, um sicherzustellen, dass alle korrekten Fälle korrekt übereinstimmen und alle falschen Fälle nicht. Es ist wirklich schwer, "alle" zu testen, und mit 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 die RegEx-Engine von JavaScript obligatorisch ausgewählt, weil ich sie problemlos live im Browser testen kann und weil ich bei der Verwendung von RegEx-Literalen keine Zeichenfolgen maskieren 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 Saiten miteinander verglichen werden:

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

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

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

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

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

Wunderbar, jetzt können Benutzer bar eingeben und etwas wird passieren, bis Sie Fehlerberichte von Benutzern erhalten, die sagen, dass "bar" Nicht funktioniert oder dass "BAR" nicht funktioniert oder dass sie nicht funktionieren Ich habe BRA 100 Mal eingegeben und nichts passiert jemals.

Wenn Sie die Rechtschreibfehler und zusätzlichen Zeichen 'bar' != 'BAR' Ignorieren, müssen Sie sich eine Methode ausdenken, um zu testen, wo Zeichen falsch sind.

Einfache Lösung, verwenden Sie toLowerCase. Das funktioniert wunderbar, aber was ist mit unseren Benutzern, die britisches Englisch über amerikanisches Englisch verwenden, wenn Sie something == 'color' Übereinstimmen? Jetzt müssen Sie something == 'color' || somthing == 'colour' Übereinstimmen.

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

Das Farbbeispiel kann einfach abgeglichen werden mit:

/colou?r/.test( something )

ein solides Verständnis der Grundlagen regulärer Ausdrücke kann die Zeit, die Sie damit verschwenden, das Rad neu zu erfinden, erheblich reduzieren.

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 ist auf MDN zu finden

lies es.
alles davon.
dann nochmal lesen.

Es braucht Zeit zum Lernen, stellen Sie sich das als Investition vor: Eine Stunde zum Erlernen von RegEx spart jetzt eine Stunde, wenn Sie das nächste Mal einen String-Pattern-Matching durchführen müssen, und eine weitere Stunde das nächste Mal danach.

Trainieren

Nachdem Sie alles über RegEx gelesen haben, werden Sie wahrscheinlich das meiste nicht verstehen. Das liegt daran, dass Sie eigentlich nichts damit machen .

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

JS bietet einige 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 ein einfacher Weg, um Ihren Fuß in die Tür zu bekommen. Spielen Sie damit, brechen Sie es und sehen Sie, was passt und was nicht.

Wenn Sie beim Üben stecken bleiben, fahren Sie mit 30 Fort. Sie müssen lesen, um mehr zu lernen, aber Sie müssen üben, um wirklich zu verstehen, was Sie gelernt haben.

6
zzzzBov

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.

5
Michael Easter

In der normalen Entwicklung kann das Debuggen von Code sehr nützliche Erkenntnisse liefern. Reguläre Ausdrücke sind nicht anders. Wenn Sie also das Risiko haben, wie eine Werbung zu klingen, erhalten Sie RegexBuddy . Es hat ein großartiges Werkzeug, um visuell anzuzeigen, was die Engine tut, während sie Ihren Ausdruck und die Eingabezeichenfolge verarbeitet.

4
John Fisher

Zusätzlich zu einer guten Referenz besteht die Art und Weise, wie Sie wirklich lernen darin, gute Lernwerkzeuge zu verwenden. Einer verwendet den Open-Source-Editor Vim mit zwei Optionen:

  1. : set incsearch ... Während Sie ein Suchmuster in die Befehlszeile eingeben, springt der Editor im laufenden Betrieb zum ersten Text, der übereinstimmt, und hebt genau hervor, was übereinstimmt. Wenn Sie etwas eingeben, das nicht mehr mit etwas übereinstimmt, springt Vim mit dem Cursor zurück zu Ihrer Position, als Sie begonnen haben.
  2. : set hlsearch ... dies weist Vim an, einen hervorgehobenen Hintergrund für den gesamten Text anzuzeigen, der der aktuellen RE-Suche entspricht.

Die andere Möglichkeit besteht darin, einen kostenlosen Tool-Aufruf RegExCoach zu verwenden. Sie fügen Text ein, den Sie suchen möchten, und entwickeln dann in einem anderen Fenster Ihren regulären Ausdruck. Wie Vim werden erfolgreiche Spiele im laufenden Betrieb hervorgehoben.

3
Firstrock

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 ein großartiges Werkzeug, um loszulegen.

  1. Was ist es? RegEx ist eine Sprache zum Ausdrücken des Mustervergleichs. Das heißt, Sie können damit eine Kombination von Zeichen erstellen, die Muster im Text erkennt oder findet. Wie ist das nützlich? Während der Programmierung können Sie Computer anweisen, Text aus einer bestimmten Quelle (Benutzereingabe, Webseite usw.) abzugleichen und festzustellen, ob bestimmte Textmuster darin enthalten sind oder nicht. 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 jedes Zeichen an, das zwischen 1 und 30 Mal wiederholt wird. Mit anderen Worten, Sie können keine leere Zeichenfolge haben und sie darf nicht länger als 30 sein Figuren. Und von dort geht es weiter.

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

3
Jay Imerman

Reguläre Ausdrücke können sehr schnell sehr kompliziert werden. Ich würde Ihnen daher empfehlen, sie mithilfe von Tutorials zu lernen. Beachten Sie, dass die einfachste Form des regulären Ausdrucks eine Zeichenfolge ist, die das darstellt, wonach Sie suchen. Um spezielle Suchregeln definieren zu können, sind leider bestimmte Zeichen erforderlich, und diese Zeichen müssen maskiert werden, da sonst ein ungültiger oder falscher regulärer Ausdruck erstellt wird.

Mein Rat ist, mit einem Beispiel für etwas zu beginnen, nach dem Sie suchen, und ihm zu entkommen. Mit anderen Worten, wenn Sie 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 mit dem Escapezeichen, damit Sie nach dem Literalzeichen suchen: \(this is an example of something you'd want to find\)

Testen Sie es und stellen Sie sicher, 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 ")" für eine beliebige Anzahl von Vorkommen ist, einschließlich 0).

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

Das ist alles. Und oh, lerne und liebe\Q ...\E. In den meisten Sprachen mit regulären Ausdrücken gibt\Q den Beginn eines Literalmusters und\E das Ende an, falls Sie nach besonders anspruchsvollen Mustern suchen müssen und nicht wissen, wie Sie ihnen entkommen können. Das hat mir mehr als ein paar Mal das Leben gerettet.

3
Neil

Zwei gute andere Antworten sagen Ihnen, dass Sie die Theorie hinter Regexen lernen und üben müssen, was beides gute Ratschläge sind. Ich würde auch empfehlen, ein gutes visuelles Regex-Tool zu verwenden, um Ihnen zu helfen, wenn Sie es ernst meinen.

RegexBuddy verfügt beispielsweise über einen visuellen Debug-Modus, mit dem Sie die Ausführung eines regulären Ausdrucks schrittweise durchlaufen und anhand von Markierungen und erläuterndem Text die Regex-Engine anzeigen können bei jedem Schritt tun. Es gibt ein Video, das dieses Debugging demonstriert auf ihrer Site.

2
Steven

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

Übrigens habe ich auf dieser Website ganz einfach reguläre Ausdrücke gelernt: http://www.regular-expressions.info/

2
Thiago Negri

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

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

Eines Tages bemerken Sie, dass kleine Unterschiede in der Rechtschreibung nicht verhindern sollten, dass zwei Wörter gleich sind: d. H. "Organisieren" und "organisieren" sollten gleich vergleichen. 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 möchten, dass alle Wörter, die mit "ize" enden, mit ihren Brüdern in britischer Schreibweise gleich sind. Oder Wiederholungen einiger Saiten eine bestimmte Anzahl von Malen. Und natürlich müssen Sie all das kombinieren.

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

Und dann ist es ziemlich einfach und läuft auf die folgenden 3 Grundprinzipien hinaus:

Sie haben grundlegende reguläre Ausdrücke: Zeichen, die für sich selbst stehen, Zeichenklassen, handliche und nicht so 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 es auch r1r2 r1 | r2 (r1).

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

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

2
Ingo

Wenn ich sehe, was mit dem regulären Ausdruck übereinstimmt, während ich ihn baue, erleichtert dies mir das Leben und hat mir geholfen, sie besser zu verstehen.

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

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

1
jwernerny

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-Motoren denselben Prinzipien. Sie sind alle Finite-State-Maschinen und wenn Sie das wirklich verstehen, dann haben Sie fast jeden Code, den Sie schreiben, im Griff. Es ähnelt der Lernrekursion, indem Sie es, sobald Sie es erhalten, instinktiv auf Probleme anwenden. 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 nach vorne 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 erhalten und es von Anfang an durchgehen, lernen Sie alles, was Sie gefragt haben, und haben ein enorm leistungsfähiges Werkzeug für den Rest Ihrer Karriere.

Diese Frage enthält eine Reihe von Lernressourcen und ein flexibles Skelett, das ich zusammengeschmissen habe.

1
Spencer Rathbun

Außerdem versuche ich zuerst sicherzustellen, dass es keinen einfacheren Weg gibt, das Problem zu lösen/die Zeichenfolge zu "tokenisieren".

Wenn Sie keine finden können, betrachte ich es als ein Problem, nicht zu versuchen, das zu finden, was Sie von der Zeichenfolge erwarten, sondern es geht darum, NICHT das zu finden, was Sie nicht wollen. Dies liegt hauptsächlich daran, dass Regex gierig sind. Aber es hat mir als Ansatz gedient, 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 könnte.

1
frogstarr78

Ein Ansatz, den ich verwendete, bestand darin, eine Reihe von Open-Source-Projekten zu finden, für die Syntaxaktualisierungen erforderlich waren, und dann ein immer komplexer werdendes 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 laufen Sie gegen viele verschiedene Projekte mit unterschiedlichen Stilen. Ich begann mit etwas sehr Einfachem wie %s/before/after dann fand ich, dass es zu vielen Fällen entsprach. Also habe ich mehr hinzugefügt, um das zu verhindern. Dann fand ich verschiedene Projekte mit unterschiedlichen Syntaxstilen, die unterschiedliche Änderungen erforderten.

Am Ende endete ich mit

  • große Fähigkeiten und Kenntnisse über reguläre Ausdrücke
  • gute Fähigkeiten mit sed
  • unterstützung vieler Open Source-Projekte
  • ich bekomme eine Menge Beitragsaktivität in meinem Github-Profil
  • ein weiteres gutes "Schweizer Taschenmesser" Werkzeug für den virtuellen Werkzeuggürtel

und wurde bei diesem Ansatz durch die Notwendigkeit geholfen

  • tatsächliche Ziele erreichen, ohne zu betrügen
  • verwenden Sie die (Regex-) Fähigkeiten als Teil eines größeren Ziels mit größerer Motivation.
  • in der Lage sein, Beweise für die Fähigkeiten zu zeigen, die ich gelernt habe, indem ich den Code anderer geändert und dann die Änderungen überprüft habe.

Ich werde auch weitergeben, dass es eine Reihe von Websites für die verschiedenen Sprachen gibt - Ruby, Javascript usw., auf denen Sie zur sofortigen Befriedigung mit Ausdrücken und Beispieltext herumspielen können. Diese sind:

regexes in mehreren Sprachen auf einer Site

konzentrieren Sie sich auf die Spielgruppen:

1
Michael Durrant

Ich habe festgestellt, dass man reguläre Ausdrücke ähnlich wie 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 anzuzeigen und eine Herausforderung zu finden: "Kann ich alle E-Mail-Adressen hier rausholen" oder "Alle finden" Vorkommen des Wortes "Code", das eher als Verb als als Substantiv verwendet wird, "solche Sachen".

Das 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 ich damit Regex in Echtzeit testen kann: http://www.gethifi.com/tools/regex

0