Regulärer Ausdruck ist eine logische Formel für Zeichenfolgenoperationen. Es handelt sich um eine wichtige und komplexe Technologie bei der Verarbeitung von Textdaten. Wie kann man reguläre Ausdrücke schnell beherrschen? Der folgende Artikel empfiehlt eine Lernmethode: durch AST. Hoffe, es hilft allen!
Reguläre Ausdrücke werden grundsätzlich zum Verarbeiten von Zeichenfolgen verwendet. Sie sind sehr praktisch, um Zeichenfolgen abzugleichen, zu extrahieren und zu ersetzen.
Das Erlernen regulärer Ausdrücke ist jedoch immer noch etwas schwierig, z. B. Konzepte wie gieriges Matching, nicht gieriges Matching, Erfassen von Untergruppen und Nicht-Erfassen von Untergruppen. Es ist nicht nur für Anfänger schwer zu verstehen, sondern auch für viele Menschen, die dies getan haben Ich habe mehrere Jahre gearbeitet und verstehe es nicht.
Wie lernt man reguläre Ausdrücke besser? Wie beherrscht man reguläre Ausdrücke schnell?
Empfehle eine Möglichkeit, regelmäßige Regeln zu lernen, die ich für sehr gut halte: Lernen durch AST.
Das Matching-Prinzip regulärer Ausdrücke besteht darin, die Musterzeichenfolge in AST zu analysieren und dann dieses AST zum Abgleichen der Zielzeichenfolge zu verwenden.
Verschiedene Informationen in der Musterzeichenfolge werden nach der Analyse in AST gespeichert. AST ist ein abstrakter Syntaxbaum, der nach einer grammatikalischen Struktur organisiert ist. Anhand der Struktur von AST können Sie die von regulären Ausdrücken unterstützte Syntax leicht erkennen.
Wie kann ich den AST eines regulären Ausdrucks anzeigen?
Sie können es visuell über die Website astexplorer.net anzeigen:
Stellen Sie die Analysesprache auf RegExp um und Sie können den AST regulärer Ausdrücke visualisieren.
Wie bereits erwähnt, ist AST ein Baum, der nach Grammatik organisiert ist, sodass verschiedene Grammatiken leicht aus seiner Struktur heraussortiert werden können.
Dann lernen wir verschiedene Syntaxen aus der Perspektive von AST:
Beginnen wir mit der einfachen Syntax, /abc/, und ihr AST ist so :
3 Zeichen, die Werte sind a, b, c und der Typ ist einfach. Der anschließende Abgleich besteht darin, den AST zu durchlaufen und jeweils diese drei Zeichen abzugleichen.
Wir haben es mit der Exec-API getestet:
Das 0. Element ist die übereinstimmende Zeichenfolge und Index ist der Startindex der übereinstimmenden Zeichenfolge. Eingabe ist die Eingabezeichenfolge.
Versuchen wir es noch einmal mit Sonderzeichen:
/ddd/ bedeutet die Zuordnung von drei Zahlen, und d ist ein Metazeichen (Metazeichen) mit besonderer Bedeutung, das durch reguläre Ausdrücke unterstützt wird.
Aus AST können wir auch ersehen, dass sie zwar auch Char sind, ihr Typ jedoch tatsächlich Meta ist:
Sie können jede Zahl über das Metazeichen von d abgleichen:
Welche sind Meta-Char und welche Sind einfach char , es ist auf einen Blick durch AST klar.
Regular unterstützt die Angabe eines Zeichensatzes über [], was bedeutet, dass es mit jedem der Zeichen übereinstimmen kann.
Aus AST können wir auch ersehen, dass es mit einer Schicht von CharacterClass umhüllt ist, was bedeutet, dass es sich um eine Zeichenklasse handelt, das heißt, es kann mit jedem darin enthaltenen Zeichen übereinstimmen.
Das ist im Test tatsächlich der Fall:
Regulärer Ausdruck unterstützt die Angabe, wie oft ein bestimmtes Zeichen wiederholt wird, unter Verwendung der Form {von, bis} ,
Zum Beispiel bedeutet /b{1,3}/, dass das Zeichen b ein- bis dreimal wiederholt wird, und /[abc]{1,3}/ bedeutet, dass die Zeichenklasse a/b/c 1 Mal wiederholt wird bis 3 mal.
Wie Sie in AST sehen können, heißt diese Syntax Wiederholung:
Es verfügt über ein Quantifiziererattribut zur Darstellung des Quantifizierers, und der Typ hier ist ein Bereich von 1 bis 3.
Regular unterstützt auch die Abkürzungen einiger Quantoren, z. B. + für 1 bis unzählige Male, * für 0 bis unzählige Male und ? für 0 oder 1 Mal.
sind verschiedene Arten von Quantoren:
Einige Schüler fragen sich vielleicht: Was bedeutet das Attribut „gierig“ hier?
gierig bedeutet gierig. Dieses Attribut gibt an, ob es sich bei dieser Wiederholung um eine gierige Übereinstimmung oder eine nicht gierige Übereinstimmung handelt.
Wenn Sie nach dem Quantifizierer ein ? hinzufügen, werden Sie feststellen, dass „gierig“ zu „falsch“ wird, was bedeutet, dass auf „nicht gierig“ umgestellt wird:
Was bedeuten also „gierig“ und „nicht gierig“?
Sehen wir uns ein Beispiel an.
Der standardmäßige Wiederholungsabgleich ist gierig und wird weiterhin abgeglichen, solange die Bedingungen erfüllt sind, sodass acbac hier abgeglichen werden kann.
Fügen Sie nach dem Quantifizierer ein ? hinzu, um auf „nicht gierig“ zu wechseln, und nur der erste wird abgeglichen:
Dies ist ein gieriges Matching und ein nicht gieriges Matching. Wir können das eindeutig erkennen Nicht gierig sind für die repetitive Syntax. Fügen Sie nach dem Quantifizierer ein ? hinzu, um zu nicht gierig zu wechseln.
(aaa)bbb(ccc)Regulärer Ausdruck unterstützt die Rückgabe eines Teils der übereinstimmenden Zeichenfolge in eine Untergruppe über (). Sehen Sie sich den AST an: Der entsprechende AST heißt Gruppe. Und Sie werden feststellen, dass es ein Erfassungsattribut hat, das standardmäßig „true“ ist: Was bedeutet das? Dies ist die Syntax für die Untergruppenerfassung. Wenn Sie die Untergruppe nicht erfassen möchten, können Sie (?:aaa) so schreiben Sehen Sie, die Erfassung ist falsch geworden. Was ist der Unterschied zwischen Capture und Non-Capture? Versuchen wir es: Oh, es stellt sich heraus, dass das Erfassungsattribut der Gruppe angibt, ob extrahiert werden soll oder nicht. Aus dem AST können wir ersehen, dasscapture für Untergruppen gilt. Der Standardwert ist Capture, was bedeutet, dass der Inhalt der Untergruppe durch ?: extrahiert wird und der Inhalt der Untergruppe nicht extrahiert wird .
Wir sind bereits mit der Verwendung von AST vertraut, um die reguläre Syntax zu verstehen, aber schauen wir uns etwas etwas Schwierigeres an: /bbb(?=ccc)/Reguläre Ausdrücke unterstützen das Ausdrücken von Lookahead-Behauptungen durch die Syntax von (?= xxx) wird verwendet, um zu bestimmen, ob einer bestimmten Zeichenfolge eine bestimmte Zeichenfolge vorangestellt ist. Sie können über AST sehen, dass diese Syntax Assertion heißt und der Typ Lookahead ist, was bedeutet, dass er nach vorne schaut und nur mit der vorherigen Bedeutung übereinstimmt: Was bedeutet das? Warum schreibst du das? Was ist der Unterschied zwischen /bbb(ccc)/ und /bbb(?:ccc)/? Versuchen wir es: Aus den Ergebnissen geht hervor: /bbb(ccc)/ stimmt mit der Untergruppe von ccc überein und extrahiert diese Untergruppe, da die Standarduntergruppe erfasst wird. /bbb(?:ccc)/ entspricht der Untergruppe von ccc, wird aber nicht extrahiert, weil wir ?: übergeben haben, um die Untergruppe so festzulegen, dass sie nicht erfasst wird. /bbb(?=ccc)/ Die mit ccc übereinstimmende Untergruppe wurde nicht extrahiert, was darauf hinweist, dass sie ebenfalls nicht erfasst wird. Der Unterschied zwischen it und ?: besteht darin, dass ccc nicht im Matching-Ergebnis erscheint. Dies ist die Natur der Lookahead-Behauptung:Lookahead-Behauptung bedeutet, dass einer bestimmten Zeichenfolge eine bestimmte Zeichenfolge vorangestellt ist, die entsprechende Untergruppe nicht erfasst wird und die bestätigte Zeichenfolge nicht im Übereinstimmungsergebnis angezeigt wird.
Wenn diese Zeichenfolge nicht folgt, wird sie nicht übereinstimmen: /bbb(?!ccc)/Change ?= to ?! Dann ändert sich die Bedeutung durch AST:Obwohl die Lookahead-Behauptung immer noch zuerst bestätigt wird, gibt es ein zusätzliches negatives Attribut von true. Diese Bedeutung ist sehr offensichtlich. Ursprünglich bedeutet dies, dass die Vorderseite eine bestimmte Zeichenfolge ist. Nach der Negierung bedeutet dies, dass die Vorderseite keine bestimmte Zeichenfolge ist. Dann ist das Übereinstimmungsergebnis genau das Gegenteil: Jetzt wird es nur dann übereinstimmen, wenn die vorhergehende Zeichenfolge keine bestimmte Zeichenfolge ist. Dies ist eine negative Lookahead-Behauptung.
Wenn es eine vorhergehende Behauptung gibt, wird es natürlich eine nachfolgende Behauptung geben, das heißt, sie passt nur, wenn ihr eine bestimmte Zeichenfolge folgt. 🎘 (?
Look-Ahead-Assertion und Look-Behind-Assertion sind die am schwierigsten zu verstehende Syntax für reguläre Ausdrücke. Ist es nicht viel einfacher, sie zu verstehen? AST~
Zusammenfassung
Reguläre Ausdrücke verarbeiten Es ist ein sehr praktisches Tool für Zeichenfolgen, aber es ist immer noch etwas schwierig zu lernen. Viele Leute sind verwirrt über Syntax wie gieriges Matching, nicht gieriges Matching, Erfassen von Untergruppen und nicht. Erfassen von Untergruppen, Lookahead-Behauptungen und Lookbehind-Behauptungen. Ich empfehle das Erlernen regulärer Regeln durch AST, einen nach grammatikalischer Struktur organisierten Objektbaum, der durch die Namen und Attribute von AST-Knoten leicht verdeutlicht werden kann.Zum Beispiel haben wir es durch AST klargestellt:
Die Wiederholungsgrammatik (Wiederholung) ist die Form von Zeichen + Quantifizierer. Die Standardeinstellung ist Greedy Matching (Greedy ist wahr), was bedeutet, dass kein Matching erfolgt. nach dem Wechseln des Quantifizierers Es wird zu einer nicht gierigen Übereinstimmung und stoppt, wenn ein Zeichen übereinstimmt.Untergruppensyntax (Gruppe) wird zum Extrahieren einer bestimmten Zeichenfolge verwendet. Die Standardeinstellung ist die Erfassung (Erfassung ist wahr), was bedeutet, dass eine Extraktion erforderlich ist (?:xxx), die nur übereinstimmt aber nicht extrahieren.
Assertion bedeutet, dass davor oder danach eine bestimmte Zeichenfolge steht, die in Lookahead-Assertion und Lookbehind-Assertion unterteilt ist. Die Syntax lautet (?=xxx) und (?
Ist es das tiefe Verständnis der Syntax in verschiedenen Dokumenten oder das tiefe Verständnis der Syntax im Compiler? Keine Frage, es muss am Compiler liegen!Dann ist es natürlich besser, die Grammatik über den Syntaxbaum zu lernen, der entsprechend der Grammatik analysiert wird, als über das Dokument.
Reguläre Ausdrücke sind so, und das Erlernen anderer Grammatik ist auch so. Wenn Sie die Grammatik mit AST lernen können, müssen Sie die Dokumentation nicht lesen.Weitere Informationen zu Knoten finden Sie unter: nodejs-Tutorial
!Das obige ist der detaillierte Inhalt vonWie beherrscht man reguläre Ausdrücke schnell? Lernen Sie reguläre Grammatik mit AST!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!