Wer jemals mit Programmieren in Kontakt kommen wird, muss früher oder später auf reguläre Ausdrücke treffen. Reguläre Ausdrücke sind zwar auf den ersten Blick nicht besonders freundlich und entmutigen oft mit ihrer Syntax, sind jedoch eines der nützlichsten Werkzeuge bei der Arbeit mit einem Code.

^(([a-zA-Z0-9]?)([A-Z]{0,12})(\d)){6,12}$

Ist diese Zeichenfolge lesbar? 🙂

Im Jahr 1951 schlug der amerikanische Mathematiker Stephen Cole Kleene das Programmiersprachenschema vor, um nach beliebigen Zeichenfolgen zu suchen. Seitdem wurden reguläre Ausdrücke für die meisten Programmiersprachen angepasst.

Wir können Regex im Quellcode verwenden, beispielsweise zur Überprüfung von Texteingaben oder zum Organisieren einer geparsten Textdatei.

Sie sind auch in Texteditoren eingebettet, was die Arbeit der Programmierer erheblich vereinfacht.

Dank regulärer Ausdrücke erstellen wir ein Textmuster anhand standardisierter Sonderzeichen, um später zu prüfen, ob es im getesteten Code vorhanden ist.

In den Beispielen werde ich JavaScript und integrierte Methoden verwenden, um die Verwendung von Regex zu ermöglichen.

Grundlagen

In JavaScript testet die Methode RegExp.prototype.test();, ob in dem von uns angegebenen String-Objekt der von uns angenommene Ausdruck vorhanden ist, ob er true oder false zurückgibt.

Im folgenden Beispiel habe ich die Variable testString deklariert und anhand der Variable den Text getestet. Versuchen Sie, den Regex oder den Text im Test in einen nicht übereinstimmenden zu ändern. In diesem Fall erhalten wir false.

Die Syntax eines regulären Ausdrucks muss mit einem Schrägstrich beginnen. Dann geben wir die Zeichenfolge und schließen den ganzen Ausdruck mit einem weiteren Schrägstrich ab.

Um zu Beginn true als Variable mit Regex zu erhalten, deklarierte ich /est/.

Nehmen wir an, ich möchte sichergehen, dass die getestete Zeichenfolge GENAU wie der reguläre Ausdruck klingt.

Das Symbol ^ am Anfang des Ausdrucks und das $ am Ende sind hier hilfreich:

Wenn wir den Teil „or not to be“ aus dem getesteten Text löschen, werden wir true bekommen.

Das Zeichen ^ prüft, ob der getestete Text wie der Beginn des Regex‘ beginnt. Das Zeichen $ überprüft die letzten Zeichen im Text. Wenn wir beide in einem regulären Ausdruck verwenden, prüfen wir, ob der Text genau so aussieht wie die Zeichen zwischen ^ und $.

Nach dem Entfernen von $ aus dem Ende des Regex‘ werden wir true erhalten, da unser getesteter Satz mit To be beginnt.

String.replace und Flags

Verwenden wir eine mehr interessante Methode String.prototype.replace().

Wie Sie wahrscheinlich bemerkt haben, hat replace die Wörter vom Regex in das gegebene Wort im zweiten Parameter der replace-Methode geändert.

Im obigen Beispiel haben wir die sogenannten Flags verwendet, d.h. die Buchstaben g und i nach dem Schrägstrich.

g bedeutet, dass der Regex für den gesamten Text verwendet werden soll (andernfalls würde sich nur das erste yellow ändern).

i bedeutet das Fehlen von case sensitivity, d.h. der Regex sowohl für kleine als auch große Buchstaben verwendet werden kann.

Machen wir weiter.

Sonderzeichen

Nehmen wir an, wir möchten die Richtigkeit der Postleitzahl im Inline-Formular testen.

Die polnischen Postleitzahlen bestehen aus 2 und 3 Ziffern, die durch einen Bindestrich getrennt sind.

Hier helfen uns Sonderzeichen.

Bei Verwendung von Backslash und Kleinbuchstaben d beziehen wir uns auf eine einzelne Ziffer (digit).

Im Regex haben wir zuerst 2 Ziffern (\d\d), gefolgt von einem Bindestrich (-) und weitere 3 Ziffern (\d\d\d).

Wir können diese Aufzeichnung jedoch vereinfachen, indem wir die erste Art von Quantoren verwenden.

Wenn wir nach einem bestimmten Ausdruck {2} schreiben, bedeutet dies, dass sich der Ausdruck zweimal wiederholen muss, um true zurückzugeben.

Wenn wir möchten, dass sich der Ausdruck 2 bis 7 Mal wiederholt – {2,7}.

Mehr als 5 Mal? – {5,}.

Ändern wir unseren Regex:

Beachten Sie, dass das Skript auch true zurückgibt, wenn Sie nach der Eingabe der Zahl 456 weitere Zahlen eingeben. Dies liegt daran, dass wir die Validierungslänge nicht mit ^ und $ begrenzt haben. Regex erhält 3 Ziffern nach dem Bindestrich und endet. Der Rest, obwohl es eine Fortsetzung unseres Textes ist, interessiert ihn nicht mehr.

Versuchen Sie, mehr Ziffern in die testString-Variable und ^ und $ am Anfang und am Ende des Regex‘ einzugeben, wie im vorherigen Teil des Artikels.

Werden Sie schaffen, dass false zurückgegeben wird?

Nehmen wir noch einen anderen Quantor.

Das Zeichen ? bedeutet, dass ein bestimmter Teil des Regex‘ 0 oder 1 Mal erscheinen kann.

Was heißt das in der Praxis? Sehen Sie sich das Beispiel an:

Ich nahm an, dass in unserer getesteten Zeichenfolge ein Bindestrich 0 oder 1 Mal vorkommen kann.

Für den ersten Test mit 1 Bindestrich: true.
Für den zweiten Test ohne Bindestrich (0 Mal): true.
Im dritten Beispiel wurde ein Bindestrich neben einem Bindestrich angezeigt: false.

Zeichensätze

Verwenden Sie die eckigen Klammern in einem regulären Ausdruck, um zu überprüfen, ob in der getesteten Zeichenfolge irgendeines Zeichen aus der Klammer erscheint.

Wenn Regex so aussehen würde: /[abc]/, wird uns die Testmethode true zurückgeben, wenn sie auf a, b oder c stößt.

 

Wir können auch Zeichenbereiche verwenden.

[a-z] findet Kleinbuchstaben aus dem Alphabet, [A-Z] große Buchstaben und [0-9] beliebige Ziffer.

Natürlich können wir Sätze mit Quantoren verbinden.

[A-Z] {0,12} bedeutet, dass der Text zwischen 0 und 12 Großbuchstaben aus dem Bereich von a bis z enthalten muss.

Einfach, oder?

Am Anfang des Artikels habe ich ein Beispiel für einen Regex gegeben. Für mich war ein solcher Regex zu Beginn des Abenteuers mit regulären Ausdrücken erschreckend. Zu Recht?

^(([a-zA-Z0-9]?)([A-Z]{0,12})(\d)){6,12}$

Lassen Sie uns das in diesem Artikel gewonnene Wissen nutzen und sehen wir, was der Autor dieses Ausdrucks meinte.

Überspringen wir zuerst die Zeichen ^ und $.

[a-zA-Z0-9]? – bedeutet, wie Sie wahrscheinlich bereits wissen, dass wir den Buchstaben von a bis z, klein oder groß oder eine Ziffer im Bereich von 0-9 eingeben müssen, um true zurückzubekommen. Das Fragezeichen am Ende bedeutet, dass ein solcher Ausdruck genau 0 oder 1 Mal vorkommen muss.

[A-Z]{0,12) – bezeichnet den Bereich von a bis z nur aus Großbuchstaben. Es müssen mindestens 0 und maximal 12 sein.

\d – es muss eine Ziffer vorkommen.

Beachten Sie, dass jeder dieser Ausdrücke in runden Klammern steht. Sie haben eine doppelte Funktion. Erstens trennen sie bestimmte Teile des Ausdrucks und bewirken, dass der Teil des regulären Ausdrucks gespeichert wird.

Am Ende werden unsere 3 Sätze ebenfalls durch eine runde Klammer geschlossen, und die Zeichen {6,12} bedeuten, dass der gesamte Ausdruck mindestens 6 und maximal 12 Mal wiederholt werden muss.

Unsere bereits bekannten ^ und $ bedeuten, dass der gesamte getestete String die gleiche Form wie der Ausdruck haben muss. Nicht mehr, nicht weniger.

Testen wir es!

 

Da der erste (? – 0 oder 1 Mal) und der zweite ({0,12}) Teil des Ausdrucks 0 Mal wiederholt werden kann, um true zu ergeben, brauchen wir mindestens sechs ({6, 12}) Ziffern (\d).

Unter 6 Ziffern gibt das Skript den Wert false zurück (versuchen Sie es mit 01234).

Rätsel 1:

Für wie viele maximale Ziffern, die in testString eingegeben wurden, gibt das Skript den Wert true zurück?

 

Antwort:

24

 

Warum?

Jeder Ausdruck kann eine Ziffer aus dem Ausdruck [a-zA-Z0-9]? haben und muss die zweite Ziffer aus dem Ausdruck \d haben, was nach der Multiplikation mit dem maximalen Bereich von {6,12} 24 Ziffern ergibt.

Rätsel 2:

Wir wissen, dass die Mindestanzahl an Zeichen, die true zurückgeben, 6-stellig ist.

Und wie viele maximal Zeichen können wir in der testString-Variablen haben?

Antwort:

168

 

What next?

Im obigen Artikel konnte ich das komplexe Thema von regulären Ausdrücken nur ein bisschen besprechen. Wie Sie sehen, können Sie Textteile testen, Text ändern und viele andere nützliche Dinge tun.

Wo kann es nützlich sein? Jegliche Validierung von Kontaktformularen, Richtigkeit der Daten, E-Mails, Telefonnummern, E-Mail-Adressen, URL-Links…

Die Fortsetzung folgt.