Schnelle und reguläre Ausdrücke Syntax

1. Einleitung

Einfach ausgedrückt, reguläre Ausdrücke (kurz "Regex" oder "Regex") sind eine Möglichkeit, String-Muster anzugeben. Sie sind ohne Zweifel mit der Such- und Ersetzungsfunktion in Ihrem bevorzugten Texteditor oder IDE vertraut. Sie können nach genauen Wörtern und Phrasen suchen. Sie können auch Optionen wie z. B. Groß- und Kleinschreibung aktivieren, sodass bei der Suche nach dem Wort "Farbe" auch "Farbe", "FARBE" und "CoLoR" gefunden werden. Was wäre, wenn Sie nach den Schreibvarianten des Wortes "color" (amerikanische Schreibweise: color, britische Schreibweise: color) suchen möchten, ohne zwei separate Suchen durchführen zu müssen?

Wenn dieses Beispiel zu einfach erscheint, wie wäre es, wenn Sie nach allen Schreibvarianten des englischen Namens "Katherine" suchen möchten (Catherine, Katharine, Kathreen, Kathryn usw., um nur einige zu nennen)? Im Allgemeinen möchten Sie vielleicht ein Dokument nach allen Zeichenfolgen durchsuchen, die Hexadezimalzahlen, Datumsangaben, Telefonnummern, E-Mail-Adressen, Kreditkartennummern usw. ähneln.

Reguläre Ausdrücke sind ein wirksames Mittel, um diese (und viele andere) praktische Probleme im Zusammenhang mit Text (teilweise oder vollständig) zu lösen.

Gliederung

Der Aufbau dieses Tutorials ist wie folgt. Ich werde die Kernkonzepte vorstellen, die Sie verstehen müssen, indem Sie einen Ansatz anpassen, der in theoretischen Lehrbüchern verwendet wird (nachdem Sie nicht mehr benötigte Rigorosität oder Pedanterie entfernt haben). Ich bevorzuge diesen Ansatz, weil er es Ihnen ermöglicht, Ihr Verständnis von vielleicht 70% der Funktionalität, die Sie benötigen, im Zusammenhang mit einigen grundlegenden Prinzipien zu vermitteln. Die verbleibenden 30% sind erweiterte Funktionen, die Sie später erlernen oder überspringen können, es sei denn, Sie möchten Regex-Meister werden.

Mit regulären Ausdrücken gibt es eine Menge Syntax, aber die meisten davon sind nur dazu da, um die Kernideen so präzise wie möglich anzuwenden. Ich werde diese inkrementell einführen, anstatt eine große Tabelle oder Liste zu löschen, die Sie sich merken können.

Anstatt direkt in eine Swift-Implementierung einzusteigen, werden wir die Grundlagen mit einem hervorragenden Online-Tool erkunden, das Ihnen dabei hilft, reguläre Ausdrücke mit einem Minimum an Reibung und unnötigem Gepäck zu entwerfen und zu bewerten. Sobald Sie sich mit den Hauptideen vertraut gemacht haben, ist das Schreiben von Swift-Code im Wesentlichen ein Problem der Zuordnung Ihres Verständnisses zur Swift-API.

Wir werden stets versuchen, eine pragmatische Einstellung zu bewahren. Regexes sind nicht das beste Werkzeug für jede Situation der Zeichenfolgenverarbeitung. In der Praxis müssen wir Situationen ermitteln, in denen reguläre Ausdrücke sehr gut funktionieren, und Situationen, in denen dies nicht der Fall ist. Es gibt auch einen Mittelweg, wo Regex zum Teil eines Jobs verwendet werden kann (normalerweise einige Vorverarbeitung und Filterung) und der Rest des Jobs der algorithmischen Logik überlassen wird.

Kernkonzepte

Reguläre Ausdrücke haben ihre theoretischen Grundlagen in der "Theorie der Berechnung", einem der von der Informatik untersuchten Themen, wo sie die Rolle der Eingabe spielen, die auf eine bestimmte Klasse von abstrakten Rechenmaschinen, die endliche Automaten genannt werden, angewendet werden.

Entspannen Sie sich, Sie müssen jedoch nicht den theoretischen Hintergrund studieren, um reguläre Ausdrücke praktisch zu verwenden. Ich erwähne sie nur, weil der Ansatz, mit dem ich zunächst reguläre Ausdrücke von Grund auf motivieren werde, den Ansatz widerspiegelt, der in Lehrbüchern für Informatik verwendet wird, um "theoretische" reguläre Ausdrücke zu definieren.

Vorausgesetzt, Sie sind mit der Rekursion vertraut, möchte ich Sie daran erinnern, wie rekursive Funktionen definiert werden. Eine Funktion wird in Form einfacherer Versionen von sich selbst definiert. Wenn Sie eine rekursive Definition nachverfolgen, müssen Sie zu einem explizit definierten Basisfall gelangen. Ich spreche das an, weil unsere Definition unten ebenfalls rekursiv sein wird.

Wenn wir über Strings im Allgemeinen sprechen, denken wir implizit an einen Zeichensatz wie ASCII, Unicode usw. Stellen wir uns vor, wir leben in einem Universum, in dem die Strings aus den 26 Buchstaben des Kleinbuchstabens bestehen Alphabet (a, b,… z) und sonst nichts.

Regeln

Wir beginnen mit der Behauptung, dass jedes Zeichen in dieser Menge als regulärer Ausdruck betrachtet werden kann, der sich selbst als Zeichenfolge angibt. So ein als regulärer Ausdruck entspricht "a" (als String betrachtet), b ist ein Regex, der mit der Zeichenfolge "b" übereinstimmt. Nehmen wir auch an, es gibt einen "leeren" regulären Ausdruck Ɛ das entspricht der leeren Zeichenfolge "". Solche Fälle entsprechen den trivialen "Basisfällen" der Rekursion.

Nun betrachten wir die folgenden Regeln, die uns dabei helfen, aus bestehenden Ausdrücken neue reguläre Ausdrücke zu machen:

  1. Das Verkettung (d. h. "Aneinanderreihen") von zwei regulären Ausdrücken ist ein neuer regulärer Ausdruck, der der Verkettung zweier Strings entspricht, die mit den ursprünglichen regulären Ausdrücken übereinstimmen.
  2. Das Wechsel Bei zwei regulären Ausdrücken handelt es sich um einen neuen regulären Ausdruck, der mit den beiden ursprünglichen regulären Ausdrücken übereinstimmt.
  3. Das Kleene Stern eines regulären Ausdrucks entspricht keiner oder mehreren benachbarten Instanzen des ursprünglichen regulären Ausdrucks.

Lassen Sie uns dies anhand einiger einfacher Beispiele mit unseren alphabetischen Zeichenfolgen konkretisieren.

Beispiel 1

Von Regel 1, ein und b reguläre Ausdrücke bedeuten, die auf "a" und "b" passen ab ist ein regulärer Ausdruck, der mit der Zeichenfolge "ab" übereinstimmt. Schon seit ab und c sind reguläre Ausdrücke, ABC ist ein regulärer Ausdruck, der mit der Zeichenfolge "abc" übereinstimmt, und so weiter. Auf diese Weise können wir beliebig lange reguläre Ausdrücke erstellen, die einer Zeichenfolge mit identischen Zeichen entsprechen. Es ist noch nichts Interessantes passiert.

Beispiel 2

Von Regel 2, O und ein regelmäßige Ausdrücke sein, o | a entspricht "o" oder "a". Der vertikale Balken steht für den Wechsel. c und t sind reguläre Ausdrücke, und zusammen mit Regel 1 können wir das behaupten c (o | a) t ist ein regulärer Ausdruck. Die Klammern werden zum Gruppieren verwendet.

Was passt dazu?? c und t nur sich selbst anpassen, was bedeutet, dass der Regex c (o | a) t entspricht "c", gefolgt von einem "a" oder einem "o", gefolgt von "t", zum Beispiel der Zeichenfolge "cat" oder "cot". Beachten Sie, dass dies der Fall ist nicht passen Sie "Mantel" als an o | a entspricht nur "a" oder "o", jedoch nicht beide gleichzeitig. Jetzt beginnen die Dinge interessant zu werden.

Beispiel 3

Von Regel 3, ein* entspricht null oder mehr Instanzen von "a". Sie entspricht der leeren Zeichenfolge oder den Zeichenfolgen "a", "aa", "aaa" usw. Lassen Sie uns diese Regel in Verbindung mit den beiden anderen Regeln anwenden.

Was macht heiß Spiel? Es stimmt mit "ht" (mit null Instanzen von "o"), "hot", "hoot", "hooot" und so weiter überein. Wie wäre es mit b (o | a) *? Es kann mit "b" übereinstimmen, gefolgt von einer beliebigen Anzahl von "o" und "a" (einschließlich keiner davon). "b", "boa", "baa", "bao", "baooaoaoaoo" sind nur einige der unendlich vielen Zeichenfolgen, denen dieser reguläre Ausdruck entspricht. Beachten Sie erneut, dass die Klammern verwendet werden, um den Teil des regulären Ausdrucks zu gruppieren, zu dem der * angewendet wird.

Beispiel 4

Versuchen wir, reguläre Ausdrücke zu entdecken, die mit den Zeichenfolgen übereinstimmen, an die wir uns bereits erinnern. Wie würden wir einen regulären Ausdruck machen, der das Blöken von Schafen erkennt, was ich als eine beliebige Anzahl von Wiederholungen des Grundklangs "baa" ("baa", "baabaa", "baabaabaa" usw.) bezeichnen kann

Wenn du gesagt hättest, (baa) *, dann bist du fast richtig. Beachten Sie jedoch, dass dieser reguläre Ausdruck auch mit der leeren Zeichenfolge übereinstimmen würde, die wir nicht möchten. Mit anderen Worten, wir wollen nicht blökende Schafe ignorieren. baa (baa) * ist der reguläre Ausdruck, nach dem wir suchen. In ähnlicher Weise könnte eine Kuh mooing sein Moo (Moo) *. Wie können wir den Klang eines Tieres erkennen? Einfach. Verwenden Sie alternativ. baa (baa) * | moo (moo) *

Wenn Sie die obigen Ideen verstanden haben, herzlichen Glückwunsch, sind Sie auf gutem Weg.

2. Angelegenheiten der Syntax

Erinnern wir uns, dass wir unseren Saiten eine dumme Einschränkung auferlegt haben. Sie können nur aus Kleinbuchstaben des Alphabets bestehen. Wir werden diese Einschränkung jetzt aufheben und alle aus ASCII-Zeichen bestehenden Zeichenfolgen berücksichtigen.

Wir müssen uns darüber im Klaren sein, dass reguläre Ausdrücke selbst als Strings dargestellt werden müssen, damit reguläre Ausdrücke ein praktisches Werkzeug sind. Anders als früher können wir also keine Zeichen wie verwenden *, |, (, ), usw. ohne irgendwie zu signalisieren, ob wir sie als "Sonderzeichen" für Abwechslung, Gruppierung usw. verwenden oder ob wir sie als gewöhnliche Zeichen behandeln, die wörtlich abgeglichen werden müssen.

Die Lösung besteht darin, diese und andere "Metazeichen" zu behandeln, die eine besondere Bedeutung haben können. Um zwischen einer Verwendung und der anderen zu wechseln, müssen wir ihnen entkommen können. Dies ähnelt der Idee der Verwendung von "\ n" (Escape-Zeichen vor dem n), um eine neue Zeile in einer Zeichenfolge anzuzeigen. Etwas komplizierter ist es, dass abhängig von dem Kontextzeichen, das normalerweise "Meta" ist, es sein buchstäbliches Ich ohne Hemmung darstellen kann. Beispiele dafür werden wir später sehen.

Eine andere Sache, die wir schätzen, ist die Prägnanz. Viele reguläre Ausdrücke, die nur durch die Notation des vorherigen Abschnitts ausgedrückt werden können, wären langwierig ausführlich. Angenommen, Sie möchten nur alle zwei Zeichenfolgen finden, die aus einem Kleinbuchstaben gefolgt von einer Ziffer bestehen (z. B. Zeichenfolgen wie "a0", "b9", "z3" usw.). Bei Verwendung der zuvor besprochenen Notation würde dies zu dem folgenden regulären Ausdruck führen:

(a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z) (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)

Nur das Monster zu tippen, hat mich ausgelöscht.

Nicht [abcdefghijklmnopqrstuvwxyz] [0123456789] Wie eine bessere Darstellung aussehen? Beachten Sie die Metazeichen [ und ] das bedeutet eine Menge von Zeichen, von denen jeder eine positive Übereinstimmung ergibt. Wenn wir bedenken, dass die Buchstaben a bis z und die Ziffern 0 bis 9 im ASCII-Satz der Reihe nach vorkommen, können wir den Regex auf ein Minimum reduzieren [a-z] [0-9].

Innerhalb der Grenzen eines Zeichensatzes der Bindestrich, -, ist ein anderes Metazeichen, das einen Bereich angibt. Beachten Sie, dass Sie mehrere Bereiche in dasselbe Paar eckige Klammern einfügen können. Zum Beispiel, [0-9a-zA-Z] kann mit jedem alphanumerischen Zeichen übereinstimmen. Das 9 und ein (und  z und EIN)Wenn Sie gegeneinander gedrückt werden, sieht das vielleicht komisch aus. Denken Sie jedoch daran, dass es bei regulären Ausdrücken nur um Kürze geht und die Bedeutung klar ist.

Apropos Kürze: Es gibt noch präzisere Möglichkeiten, bestimmte Klassen verwandter Charaktere darzustellen, wie wir gleich sehen werden. Beachten Sie, dass die Wechselleiste angezeigt wird, |, ist immer noch gültig und nützlich, wie wir gleich sehen werden.

Weitere Syntax

Bevor wir anfangen zu üben, werfen wir einen Blick auf die Syntax.

Zeitraum

Die Periode, ., Stimmt mit jedem einzelnen Zeichen überein, mit Ausnahme von Zeilenumbrüchen. Das bedeutet, dass c.t kann "cat", "crt", "c9t", "c% t", "c.t", "c t" usw. zuordnen. Wenn wir die Periode als gewöhnliches Zeichen anpassen möchten, um beispielsweise die Zeichenfolge "c.t" zu finden, können wir sie entweder entfernen (c \ .t) oder in eine eigene Zeichenklasse (c [.] t).

Im Allgemeinen gelten diese Ideen auch für andere Metazeichen, wie z [, ], (, )*, und andere, denen wir noch nicht begegnet sind.

Klammern

Klammern (( und )) werden zum Gruppieren verwendet, wie wir zuvor gesehen haben. Wir werden das Wort verwenden Zeichen entweder ein einzelnes Zeichen oder einen Ausdruck in Klammern. Der Grund ist, dass viele Regex-Operatoren auf beide angewendet werden können.

Zur Definition werden auch Klammern verwendet Gruppen erfassen, So können Sie herausfinden, welcher Teil Ihres Spiels war gefangen von einer bestimmten Erfassungsgruppe in der Regex. Ich werde später mehr über diese sehr nützliche Funktionalität sprechen.

Plus

EIN + einem Token folgend ist eine oder mehrere Instanzen dieses Token. In unserem Beispiel für Blöken von Schafen, baa (baa) * könnte prägnanter als dargestellt werden (baa)+. Erinnere dich daran * bedeutet null oder mehr Vorkommen. Beachten Sie, dass (baa)+ unterscheidet sich von baa+, weil in der ehemaligen die + wird auf die angewendet baa Token, wohingegen es im letzteren nur für das gilt ein bevor. Im letzteren passt es zu Zeichenfolgen wie "baa", "baaa" und "baaaa"..

Fragezeichen

EIN ? Wenn Sie einem Token folgen, bedeutet dies null oder eine Instanz dieses Tokens.

Trainieren

RegExr ist ein hervorragendes Online-Tool, um mit regulären Ausdrücken zu experimentieren. Wenn Sie mit dem Lesen und Schreiben regulärer Ausdrücke vertraut sind, ist die Verwendung der API für reguläre Ausdrücke des Foundation Framework viel einfacher. Selbst dann ist es einfacher, Ihren regulären Ausdruck zuerst auf der Website in Echtzeit zu testen.

Besuchen Sie die Website und konzentrieren Sie sich auf den Hauptteil der Seite. Das wirst du sehen:

Sie geben einen regulären Ausdruck in das Feld oben ein und geben den Text ein, in dem Sie nach Übereinstimmungen suchen.

Das "/ g" am Ende des Ausdrucksfelds ist nicht Teil des regulären Ausdrucks an sich. Dies ist eine Markierung, die das allgemeine Übereinstimmungsverhalten der Regex-Engine beeinflusst. Durch das Anhängen von "/ g" an den regulären Ausdruck sucht das Modul nach allen möglichen Übereinstimmungen des regulären Ausdrucks im Text. Dies ist das gewünschte Verhalten. Die blaue Markierung zeigt eine Übereinstimmung an. Wenn Sie mit der Maus über den regulären Ausdruck fahren, werden Sie an die Bedeutung seiner Bestandteile erinnert.

Beachten Sie, dass reguläre Ausdrücke je nach verwendeter Sprache oder Bibliothek in verschiedenen Ausführungen vorliegen. Dies bedeutet nicht nur, dass die Syntax ein wenig anders sein kann, sondern auch die Möglichkeiten und Funktionen. Swift verwendet beispielsweise die von ICU angegebene Mustersyntax. Ich bin nicht sicher, welche Variante in RegExr (das auf JavaScript läuft) verwendet wird, aber im Rahmen dieses Tutorials sind sie ziemlich ähnlich, wenn nicht identisch.

Ich möchte Sie außerdem dazu ermutigen, den Bereich auf der linken Seite zu erkunden, in dem viele Informationen übersichtlich dargestellt werden.

Unser erstes praktisches Beispiel

Um mögliche Verwirrung zu vermeiden, sollte ich erwähnen, dass wir beim Vergleichen von regulären Ausdrücken eines von zwei Dingen bedeuten können:

  1. Suche nach beliebigen (oder allen) Teilstrings einer Zeichenfolge, die mit einem regulären Ausdruck übereinstimmen
  2. Überprüfen, ob die vollständige Zeichenfolge mit dem regulären Ausdruck übereinstimmt

Die Standardbedeutung, mit der Regex-Engines arbeiten, ist (1). Worüber wir bisher gesprochen haben, ist (2). Glücklicherweise ist es einfach, die Bedeutung (2) mithilfe von Metazeichen zu implementieren, die später eingeführt werden. Mach dir jetzt keine Sorgen.

Fangen wir ganz einfach an, indem Sie unser Beispiel für das Blöken von Schafen testen. Art (baa)+ In das Ausdrucksfeld und einige Beispiele für Tests, wie unten gezeigt.

Ich hoffe, Sie verstehen, warum die erfolgreichen Spiele tatsächlich erfolgreich waren und warum die anderen versagten. Selbst in diesem einfachen Beispiel gibt es einige interessante Dinge, die hervorzuheben sind.

Gierige Übereinstimmungen

Enthält die Zeichenfolge "baabaa" zwei oder eine Übereinstimmung? Mit anderen Worten, ist jedes einzelne "baa" ein Spiel oder ist das gesamte "baabaa" ein einziges Spiel? Dies hängt davon ab, ob eine "gierige Übereinstimmung" gesucht wird oder nicht. Ein gieriges Match versucht, so viel wie möglich einer Zeichenfolge zu entsprechen.

Im Moment passt die Regex-Engine gierig zusammen, was bedeutet, dass "baabaa" ein einzelner Treffer ist. Es gibt Möglichkeiten, Lazy Matching durchzuführen, aber das ist ein fortgeschritteneres Thema. Da wir bereits alle Platten voll haben, werden wir in diesem Tutorial nicht darauf eingehen.

Das RegExr-Werkzeug lässt eine kleine, aber erkennbare Lücke in der Hervorhebung, wenn zwei benachbarte Teile einer Zeichenfolge jeweils einzeln (jedoch nicht gemeinsam) mit dem regulären Ausdruck übereinstimmen. Wir werden in Kürze ein Beispiel für dieses Verhalten sehen.

Groß-und Kleinschreibung

"Baabaa" scheitert an den Großbuchstaben "B". Angenommen, Sie wollten nur das erste "B" als Großbuchstaben zulassen. Wie lautet der entsprechende reguläre Ausdruck? Versuchen Sie es zuerst selbst herauszufinden.

Eine Antwort ist (B | b) aa (baa) *. Es hilft, wenn Sie es laut vorlesen. Großbuchstaben oder Kleinbuchstaben "b", gefolgt von "aa", gefolgt von null oder mehr Instanzen von "baa". Dies ist praktikabel, aber beachten Sie, dass dies schnell unbequem werden kann, insbesondere wenn wir die Kapitalisierung gänzlich ignorieren möchten. Zum Beispiel müssten wir für jeden Fall Alternativen angeben, was zu etwas Unhandlichem führen würde ([Bb] [Aa] [Aa])+.

Glücklicherweise haben reguläre Ausdrücke normalerweise die Option, Groß- und Kleinschreibung zu ignorieren. Klicken Sie im Falle von RegExr auf die Schaltfläche, die "Flags" liest, und aktivieren Sie das Kontrollkästchen "Fall ignorieren". Beachten Sie, dass der Buchstabe "i" der Liste der Optionen am Ende des regulären Ausdrucks vorangestellt wird. Versuchen Sie einige Beispiele mit gemischten Großbuchstaben, z. B. "BAABAA"..

Ein anderes Beispiel

Versuchen wir, einen regulären Ausdruck zu entwerfen, der Varianten des Namens "Katherine" erfassen kann. Wie würden Sie dieses Problem angehen? Ich würde so viele Variationen aufschreiben, die gemeinsamen Teile betrachten und dann versuchen, die Variationen (mit Betonung auf die alternativen und optionalen Buchstaben) als Sequenz auszudrücken. Als Nächstes würde ich versuchen, den regulären Ausdruck zu formulieren, der all diese Variationen aufnimmt.

Versuchen wir es mit dieser Variationsliste: Katherine, Katharine, Catherine, Kathreen, Kathleen, Katryn und Catrin. Ich überlasse es Ihnen, noch mehr aufzuschreiben, wenn Sie möchten. Wenn ich diese Variationen betrachte, kann ich grob sagen:

  • der Name beginnt mit "k" oder "c"
  • gefolgt von "at"
  • Möglicherweise gefolgt von einem "h"
  • möglicherweise gefolgt von einem "a" oder "e"
  • gefolgt von einem "r" oder "l"
  • gefolgt von "i", "ee" oder "y"
  • und definitiv gefolgt von einem "n"
  • möglicherweise ein "e" am Ende

Aus dieser Idee heraus kann ich den folgenden regulären Ausdruck finden:

[kc] ath [ae] (r | l) (i | ee | y) ne?

Beachten Sie, dass die erste Zeile "KatherineKatharine" zwei Übereinstimmungen ohne Trennung aufweist. Wenn Sie sich den Texteditor von RegExr genauer ansehen, können Sie den kleinen Bruch in der Hervorhebung zwischen den beiden Übereinstimmungen beobachten, über den ich zuvor gesprochen habe.

Beachten Sie, dass der obige reguläre Ausdruck auch mit Namen übereinstimmt, die wir nicht berücksichtigt haben und die möglicherweise gar nicht existieren, beispielsweise "Cathalin". Dies wirkt sich im vorliegenden Zusammenhang überhaupt nicht negativ aus. In einigen Anwendungen, z. B. bei der E-Mail-Validierung, möchten Sie jedoch genauer festlegen, welche Zeichenfolgen und welche Sie ablehnen. Dies erhöht normalerweise die Komplexität des regulären Ausdrucks.

Weitere Syntax und Beispiele

Bevor wir zu Swift übergehen, möchte ich einige weitere Aspekte der Syntax regulärer Ausdrücke diskutieren.

Kurzdarstellungen

Mehrere Klassen verwandter Charaktere sind übersichtlich dargestellt:

  • \ w alphanumerisches Zeichen, einschließlich Unterstrich, entsprechend [a-zA-Z0-9_]
  • \ d steht für eine Ziffer, äquivalent zu [0-9]
  • \ s steht für Leerzeichen, dh Leerzeichen, Tabulatoren oder Zeilenumbrüche

Diese Klassen haben auch entsprechende negative Klassen:

  • \ W steht für ein nicht alphanumerisches Zeichen ohne Unterstrich
  • \ D eine nicht-ziffer
  • \ S ein Zeichen ohne Leerzeichen

Erinnern Sie sich an die nicht-kapitalisierten Klassen und erinnern Sie sich dann daran, dass die entsprechend groß geschriebene Klasse mit dem übereinstimmt, was die nicht-kapitalisierte Klasse nicht entspricht. Beachten Sie, dass diese bei Bedarf durch Einfügen von eckigen Klammern kombiniert werden können. Zum Beispiel, [\ s \ S] steht für ein beliebiges Zeichen einschließlich Zeilenumbrüchen. Erinnern Sie sich an die Periode . passt zu jedem Zeichen außer Zeilenumbrüchen.

Anker

^ und $ sind Anker, die jeweils den Anfang und das Ende eines Strings darstellen. Denken Sie daran, dass ich geschrieben habe, dass Sie eine ganze Zeichenfolge abgleichen möchten, anstatt nach Teilzeichenfolgen zu suchen. So machen Sie das. ^ c [oau] t $ passt zu "cat", "cot" oder "cut", aber nicht etwa "catch" oder "recut".

Wortgrenzen

\ b stellt eine Grenze zwischen Wörtern dar, z. B. aufgrund von Leerzeichen oder Satzzeichen, und auch den Anfang oder das Ende der Zeichenfolge. Beachten Sie, dass es etwas anders ist, als dass es einer Position und nicht einem expliziten Zeichen entspricht. Es kann hilfreich sein, sich eine Wortgrenze als unsichtbaren Trenner vorzustellen, der ein Wort vom vorherigen / nächsten unterscheidet. Wie du es erwartet hast, \ B repräsentiert "keine Wortgrenze". \ bcat \ b findet Übereinstimmungen in "Katze", "Katze", "Hi, Katze", aber nicht in "acat" oder "catch".

Negation

Die Idee der Verneinung kann mit der ^ Metazeichen in einem Zeichensatz. Dies ist eine völlig andere Verwendung von ^ von "start of string Anker". Dies bedeutet für die Negation, ^ muss gleich zu Beginn in einem Zeichensatz verwendet werden. [^ a] stimmt mit jedem Zeichen außer dem Buchstaben "a" und [^ a-z] stimmt mit jedem Zeichen außer einem Kleinbuchstaben überein.

Kannst du repräsentieren? \ W Negation und Zeichenbereiche verwenden? Die Antwort ist [^ A-Za-z0-9_]. Was denkst du [a ^] Streichhölzer? Die Antwort ist entweder ein "a" - oder ein "^" - Zeichen, da es am Anfang des Zeichensatzes nicht vorkommt. Hier stimmt "^" wörtlich überein.

Alternativ könnten wir es explizit so entziehen: [\ ^ a]. Hoffentlich fangen Sie an, eine Vorstellung davon zu entwickeln, wie Flucht funktioniert.

Quantifizierer

Wir haben gesehen wie * (und +) kann verwendet werden, um ein Token null oder mehr (und ein oder mehrere) Male abzugleichen. Diese Idee des mehrfachen Übereinstimmens eines Tokens kann durch die Verwendung von Quantifizierern in geschweiften Klammern präzisiert werden. Zum Beispiel, 2, 4  bedeutet zwei bis vier Übereinstimmungen des vorhergehenden Tokens. 2, bedeutet zwei oder mehr Übereinstimmungen und 2 bedeutet genau zwei Übereinstimmungen.

Detaillierte Beispiele, die die meisten dieser Elemente verwenden, werden im nächsten Tutorial behandelt. Aus Gründen der Übung möchte ich Sie jedoch dazu ermutigen, Ihre eigenen Beispiele auszuarbeiten und die Syntax zu testen, die wir gerade mit dem Tool RegExr gesehen haben.

Fazit

In diesem Tutorial haben wir uns in erster Linie auf die Theorie und Syntax regulärer Ausdrücke konzentriert. Im nächsten Tutorial fügen wir dem Mix Swift hinzu. Bevor Sie fortfahren, sollten Sie wissen, was Sie in diesem Lernprogramm beschrieben haben, indem Sie mit RegExr herumspielen.