If you don’t know what regulärer Ausdruck (also known as “regex" oder "regexp”) is, it’s an unglaublich kraftvolle Sprache für die Ausführung von Suchen und/oder Ersetzen in jeder Art von Text. Regex hat eine lange und ruhmreiche Geschichte (it’s origins date back to the ‘50s) and even now, you use it every day … Sie wissen es vielleicht nur nicht. Regex ist heutzutage in den meisten wichtigen Programmiersprachen und Computersystemen integriert und wird in einer Vielzahl von Anwendungen verwendet.
Regex is no longer just for programmers: it’s showing up in all sorts of places today. Some of the places you might have seen it so far is for matching URLs in Google Analytics, search & replace in your favorite text editor (some popular editors supporting regex include Erhabenheit, Atom, Wolke9, Notepad++, Google Docs and Microsoft Word … although Word has a regex syntax that is sehr Nicht-Standard) und sogar übereinstimmende Dateinamen in unserem großartigen WordPress-Mitgliedschafts-Plugin, MemberPress.
Even though regex is now showing up in surprisingly new places, its seemingly cryptic nature will probably always make it more predominantly used by programmers and “power users.”
So here's the point in this article where you need to decide if you’re going to continue life without knowing the untold power of regex, or if you’ll swallow the red pill and wield the sword of a power user! In this post, I’ll give you the basic knowledge you’ll need to start putting this extremely useful tool to work for you. So let’s get started!
Einige Beispiele
Wie sehen Regex-Anweisungen aus? Wenn Sie eine Regex-Anweisung sehen würden, ohne zu wissen, was sie ist, würde sie wie ein völliges Kauderwelsch aussehen.
Here’s a sample regexp statement to match a phone number:
\(?\d{3}\)?[- ]\d{3}-\d{4}
Here’s one that matches a URL:
https?:\/\/[\w-]+(\.[\w-]{2,})*(:\d{1,5})?
Und eine, die mit einer E-Mail-Adresse übereinstimmen kann:
[\w\d._%+-]+@[\w\d.-]+\.[\w]{2,4}
Finally, here’s a simple search and replace that will find any domain names with the ‘test’ subdomain and change them to a ‘www’ subdomain:
Suche: test\.([^\.]+)\.com
Ersetzen: www.$1.com
Schon eingeschüchtert? Don’t be. I’ll go through how regex statements are interpreted, breaking down what we’re doing in each of these statements and explaining how to create your own.
Wie man Regex liest
Regular expressions are like normal find statements, but on steroids. For instance, if you wanted to find the name “Harry” on a web page, you’d click control-f and type “Harry” to find it. With regex you can do more than simply search for “Harry.” You could search for “Harry” or “Bob” with (Harry|Bob)
or you could search for any word starting with “Ha” with Ha\S*
.
To your computer, text is represented as a “string” of characters. In fact, if you’ve ever overheard programmers talking about code you’ve probably heard them use the term “string” when referring to some variable.
Reguläre Ausdrücke werden von links nach rechts gelesen (genau wie im Englischen und vielen anderen Sprachen) und erklären dem Computer, worauf er beim Scannen einer Zeichenfolge von links nach rechts achten muss. Wenn der Computer die einzelnen Zeichen betrachtet, folgt er diesem Ablauf:
If you look at this flowchart, as complicated as it might seem, you’ll see something very familiar here. It’s pretty much identical to how you’d expect jede search to happen on a computer and how searches that you’re currently comfortable with happen already. Regex just adds some extremely powerful features on top of normal search.
Die Grundlagen
Now before we start dissecting our example regex statements from above, let’s get through some of the very basic command characters of regex:
Repeaters: *, + and {…}
Das Sternchen (*) und das Pluszeichen (+) sind Wiederholungszeichen. Ein Wiederholungszeichen wird nur nach einem anderen Zeichen oder einer eingeschlossenen Anweisung verwendet und weist den Computer an, das vorangehende Zeichen X-mal zu wiederholen. Das Sternchen entspricht dem vorangehenden Zeichen 0 bis unendlich oft, das Pluszeichen 1 bis unendlich oft; {2}
wird es genau 2 Mal treffen; {4,6}
will match it between 4 and 6 times exactly; and {7,}
will match it between 7 and infinite times.
Platzhalter: .
You’re probably used to the star symbol being used as a wildcard, but it’s a period (.) in regex. The period will simply match jede Charakter.
Fakultativ: ?
Wie der Wiederholer wird auch das optionale Zeichen, ein Fragezeichen (?), nur nach einem anderen Zeichen oder einer eingeschlossenen Anweisung verwendet. Wenn es vorhanden ist, teilt es dem Computer mit, dass das vorangehende Zeichen in den Suchergebnissen vorhanden sein kann oder nicht.
Anfang und Ende der Zeichenfolge: ^ und $
Wenn das Caret (^) am Anfang der Regex verwendet wird, zeigt es an, dass der erste Teil der Zeichenkette abgeglichen werden soll. Das Dollarzeichen ($) am Ende der Regex bedeutet, dass das Ende der Zeichenkette gefunden werden soll.
Possible Characters: […]
Enclosing characters within brackets indicates the characters that could be matched in this position. For example, if you wanted to match an ‘n’,’m’,’l’ or ‘_’ then you could add this to your regex [nml_]
. Wenn Sie nur einen Buchstaben oder eine Zahl zuordnen möchten, können Sie Folgendes hinzufügen [A-Za-z0-9]
.
Wenn Sie ein beliebiges Zeichen abgleichen wollen außer the possible characters you can just put a caret (^) after the opening bracket. For instance, if you wanted to match any character except ‘x’,’y’,’z’ or ‘_’ you could do so with the statement: [^xyz_]
. As you can see, this can give you fine grain control over what you’re matching on a character-by-character basis.
Enclosed Statements: (…)
Manchmal möchten Sie Abschnitte Ihrer Regex als Block verwenden oder sie für später speichern. Dazu brauchen Sie die Anweisung nur in Klammern einzuschließen.
Die Flucht: \
Now, what if you want to match for the actual ‘+’, ‘.’, etc characters? Well, if you throw a backslash in front of it then that will tell your computer that you’re trying to match an actual search character, and to not interpret it as a command character.
Kurzschrift-Zeichen: /s, /S, /d, /D, /w, /W und /b
These characters are very useful and will help you match certain sets of characters. Here’s how these break down:
/s
passt auf alle Leerzeichen wie Leerzeichen und Tabulator/S
passt auf alle Zeichen ohne Leerzeichen/d
passt auf jedes beliebige Ziffernzeichen/D
passt auf alle nicht-ziffrigen Zeichen/w
entspricht einem beliebigen Wortzeichen (grundsätzlich alphanumerisch)/W
passt auf jedes Nicht-Wort-Zeichen/b
passt auf jede Wortgrenze (dazu gehören Leerzeichen, Bindestriche, Kommas, Semikolons usw.)
Natürlich gibt es noch viele andere, mächtigere Dinge, die Sie mit Regex tun können, aber mit diesen Grundlagen erhalten Sie die Werkzeuge, die Sie für 90% Ihrer fortgeschrittenen Suchanforderungen benötigen.
Aufschlüsselung unserer Telefonnummer Beispiel
Okay, now that you have the tools, let’s look through our examples to see how they work, starting with our match for the phone number:
\(?\d{3}\)?[- ]\d{3}-\d{4}
So we’ll break it down by statement:
\(?
Dies ist die erste Anweisung, nach der der Computer suchen wird. Sie beginnt mit einem Escape-Zeichen (\), gefolgt von einer offenen Klammer ((), gefolgt von einem optionalen Zeichen (?). Dies weist die Regex an, nach einer offenen Klammer zu suchen, um den Beginn einer Telefonnummer zu signalisieren, aber dass diese nicht in jedem Fall einer Telefonnummer vorhanden sein muss.
\d{3}
The second statement starts with the shorthand character for digit (\d) then it has a repeater ({3}) that will require there to be 3 digits. It does not end with a question mark because these three digits are not optional – they must be present for the search result to qualify as a phone number.
\)?
Now the computer will check for an optional closing parenthesis, but if it’s not present it can still match.
[- ]
Danach folgt eine Anweisung für mögliche Zeichen, die entweder ein Leerzeichen oder einen Bindestrich als Übereinstimmung sucht.
\d{3}-\d{4}
Schließlich gibt es noch einige Anweisungen, die 3 Ziffern gefolgt von einem Bindestrich und dann 4 Ziffern erwarten.
Sie können dies hier in Aktion sehen und ausprobieren: http://regex101.com/r/nW9iC5/3
Ein paar Dinge, die Ihnen an dieser Regex auffallen könnten, ist, dass sie nur mit zwei akzeptablen Formaten für Telefonnummern übereinstimmen wird:
(888) 888-8888
888-888-8888
It won’t match a multitude of unacceptable phone number formats such as:
8888888888
88-8888-8888
Aber es wird auch mit einigen Formaten übereinstimmen, die möglicherweise nicht geeignet sind:
(888-888-8888
888) 888-8888
(888)-888-8888
Was könnte man Ihrer Meinung nach tun, um sicherzustellen, dass diese Regex nur mit den entsprechenden Formaten übereinstimmt?
Aufschlüsselung unserer URL-Regex
First, I’d like to state that the following regex is not a comprehensive URL matching regex by any means. It will only match a web address with no arguments and has several other problems, but would serve to match many URLs effectively.
https?:\/\/[\w-]+(\.[\w-]+)*(:\d{1,5})?
Und nun zur Aufschlüsselung:
https?:\/\/
This first statement matches the protocol of the URL. Because the “s” has a question mark after it, it’s optional. There are also escape characters in front of the forward slashes, which is usually what has to happen in regex to match forward slashes. So really, the only two ways a URL could match this statement would be to begin with http://
oder https://
.
[\w-]+
Hier haben wir eine Anweisung mit möglichen Zeichen, gefolgt von einem Pluszeichen. Das bedeutet, dass die nächsten Zeichen 1 oder mehr Wortzeichen oder Bindestriche sein müssen.
(\.[\w-]+)*
Hier haben wir die Anweisung, die einem Punkt gefolgt von Wortzeichen oder Bindestrichen entspricht. Die gesamte Anweisung ist in Klammern eingeschlossen und wird von einem Pluszeichen gefolgt, das dem Computer mitteilt, dass wir die gesamte Sequenz null oder mehr Mal wiederholen können. Dieser Abschnitt könnte also übereinstimmen mit .memberpress
oder .memberpress.com
oder .memberpress.de
, und so weiter.
(:\d{1,5})?
Schließlich sieht diese Anweisung vor, dass am Ende der URL eine optionale Portnummer angehängt wird, die aus einem Doppelpunkt, gefolgt von 1 bis 5 Ziffern, besteht, die dann in Klammern gesetzt und von einem Fragezeichen gefolgt werden, um die gesamte Anweisung optional zu machen.
Here’s where you can play around with this one: http://regex101.com/r/vL5uZ2/2
Diese Regex wird übereinstimmen:
- https://memberpress.com
- https://memberpress.com
- http://localhost:3000
BUT it won’t match any parameters trailing a URL like this:
- http://localhost:3000?test=1&page=5
Was könnten Sie zu dieser Regex hinzufügen, um einige Parameter am Ende einer URL zu finden?
Wenn Sie an der umfassendsten URL-Matching-Regex interessiert sind (eine, die Parameter, Unicode-Zeichen, große TLDs usw. findet) es gibt viele von ihnen die Sie sich ansehen können, aber anscheinend ist die von Diego Perini erstellte Version die umfassendste und genaueste. können Sie sich auf seinem Github gist ansehen.
Aufschlüsselung unserer E-Mail-Regex
Eine weitere häufige Verwendung von Regex ist der Abgleich von E-Mail-Adressen. Unser Regex zum Abgleich von E-Mail-Adressen passt auf eine große Anzahl von E-Mail-Adressen:
[\w\d\._%+-]+@[\w\d.-]+\.[\w]{2,4}
Here’s the breakdown:
[\w\d\._%+-]+
Diese Anweisung passt auf ein oder mehrere Wortzeichen, Ziffern, Punkte, Unterstriche, Prozentzeichen, Pluszeichen oder Bindestriche.
@
Every email address needs an ‘@’ symbol and that’s what this matches of course.
[\w\d.-]+
After the ‘@’ symbol we need to start on the domain name. This statement will match one or more word characters, digits, periods, or dashes.
\.[\w]{2,4}
Jetzt müssen wir die Top-Level-Domain abgleichen, die aus einem Punkt, gefolgt von 2 bis 4 Wortzeichen, besteht.
Sie können auch hier mit dieser Regex herumspielen: http://regex101.com/r/yQ2wP9/1
Even though this regex isn’t 100% comprehensive it should be able to match most addresses.
Regex Suchen und Ersetzen
So in many cases you’ll care not only about matching patterns in your text with regex but also utilizing the power of search and replace with regex.
Nehmen wir das Beispiel des Suchens und Ersetzens von oben:
Suche: test\.([^\.]+)\.com
Ersetzen: www.$1.com
Hier ist die Aufschlüsselung, beginnend mit dem Suchmuster:
test\.
This first part will match any part of the string that starts with “test.”
([^\.]+)
This statement will match one or more characters that are anything except a period. The entire statement is wrapped in parentheses for a different reason than we’ve seen so far: this time it’s to save whatever is matched by this statement to be used in the replacement.
\.com
Finally, it must match a “.com” at the end.
Now, in the replacement we can use “$1” to include whatever we saved between the parentheses in the search pattern. If you had a second statement like this in the search pattern you could use it in the replacement by using “$2.”
Sie können mit dieser Such- und Ersetzungsregex hier herumspielen: http://regex101.com/r/bW5vX8/1
This search pattern has some real limitations though. It can only match URLS starting with “test.” and ending with “.com”. How do you think you could modify it to match URLs ending in “.com”, “.net” or “.org”?
Mehr über Regex lernen
This primer has given you a crash course on regular expressions but there’s plenty more to learn. You can get more info about regex on Wikipedia oder reguläre-ausdrücke.info.
Hey Blair, das Einzige, was ich an deinen Beiträgen mag, ist die Einzigartigkeit der Themen. Heutzutage liest man immer und immer wieder das Gleiche... all diese umgeschriebenen Artikel, von denen niemand weiß, wie oft sie geschrieben wurden. Ich lese jeden einzelnen Beitrag von Ihnen, weil Sie zwei Dinge einsetzen, die nicht viele Vermarkter einsetzen - Fachwissen und Professionalität. Vielen Dank für die interessanten Beiträge und bitte machen Sie weiter so. Wir alle brauchen Menschen wie Sie 🙂
Danke Ivo ...
Ich habe ein Problem mit Formularen, die den Benutzer auf ein bestimmtes Format für die Telefonnummer festlegen. Mir ist aufgefallen, dass in vielen Kontaktformularen, in denen Unternehmen technische Dienstleistungen für internationale Benutzer anbieten, eine Telefonnummer erforderlich ist. Außerhalb der USA können die Telefonnummern jedoch unterschiedliche Formate haben.
Zum Beispiel:
+45 8765-4321
+43 1-123-456-7890
+46 987-654-321
In vielen Fällen wird der Benutzer gezwungen, eine gefälschte Nummer anzugeben, um das Formular auszufüllen. Nehmen wir das erste Beispiel; es passt zufällig in das typische Zwangsformat vieler Online-Formulare. Die Person, die das Formular liest, wird jedoch glauben, dass die Nummer nach Oregon und nicht nach Dänemark geht. Man sollte meinen, dass Unternehmen, die für sich selbst international werben, sich dessen bewusst sind. Wie würden Sie dies handhaben?
Laurence, danke für den Kommentar ... Sie sprechen einen guten Punkt an. In diesem Artikel ist mein regulärer Ausdruck ziemlich starr und an US-Telefonnummern gebunden. Aber das Tolle an Regex ist, dass man es so locker oder starr machen kann, wie man es will. Wenn ich zum Beispiel nur ganze Zahlen, Leerzeichen und Bindestriche mit einem Pluszeichen vergleichen wollte, könnte ich dies tun:
Diese Regex würde auf jedes Ihrer obigen Beispiele passen, ist aber sehr großzügig. Sie würde auch auf unsinnige Muster wie:
+– — — —- —
+4-9-1-2-0-1-3-0-2
600-001-001-005-3838-38-28383
Möglicherweise wäre es besser, überhaupt keine Bindestriche, Leerzeichen oder Klammern in der Zahl zuzulassen, wenn Sie internationale Formate unterstützen wollen. Ein Beispiel hierfür wäre:
Das würde mit allen Ihren Zahlen ohne Bindestriche übereinstimmen:
+4587654321
+4311234567890
+46987654321
Diese Lösung wäre großartig, ist aber auch extrem liberal ... Sie hätten keine Möglichkeit, den Ländercode oder Ähnliches zu überprüfen.
Eine andere mögliche Lösung, wenn Sie wissen, welche Länder Sie ansprechen, wäre, alle möglichen Formate, die Sie unterstützen möchten, in Ihrer Regex wie folgt zu behandeln:
Dieses Muster würde auf jedes Ihrer drei obigen Beispiele zutreffen, aber nicht auf US-Telefonnummern usw. Es bietet eine bessere Validierung als die obigen Regex-Anweisungen, da es starrer ist, aber es wird auch keine Nummern validieren, die nicht Teil der Ländercodes 45, 43 und 46 sind.
Wenn Sie ein wenig googeln, finden Sie vielleicht eine Master-Regex für die Validierung von Telefonnummern aus der ganzen Welt. Ich habe noch keine gefunden ... wenn Sie also eine finden, lassen Sie es mich wissen. Alternativ könnten Sie Ihre eigene umfassende Regex dafür schreiben (ich bin mir sicher, dass sie sehr beliebt wäre) ... Sie müssten nur eine Technik verwenden, wie ich sie in der letzten Regex hier verwendet habe ... die aber alle numerischen Formate aus aller Welt umfasst. Ein guter Anfang wäre ein Blick auf diese Seite auf wikipedia.
Auf jeden Fall hoffe ich, dass das hilft ... Ich weiß, dass es kein Patentrezept ist, aber hoffentlich kann es Ihnen zumindest einen Hinweis auf die richtige Richtung geben.
Ich danke Ihnen für diesen informativen und dringend benötigten Artikel. Ich finde, dass die Regex-Kodierung von Leuten, die sie kennen, oft als selbstverständlich angesehen wird, und dass sie normalerweise erwarten, dass alle anderen sie auch kennen. Jetzt habe ich eine verständliche Quelle, auf die ich mich beziehen kann.
Ich verstehe, dass die Kontrolle, ob die eingegebenen Ziffern einem vorgegebenen Standard entsprechen, eine Funktion ist, mit der Fehler minimiert werden sollen. Was internationale Telefonnummern in einem Formularfeld anbelangt, so vermute ich, dass es einfacher ist, darauf zu vertrauen, dass der Benutzer überprüft, ob er die richtige Telefonnummer eingegeben hat, als zu versuchen, das Feld auf die vielen Möglichkeiten hin zu überprüfen. Die wichtigste Anwendung von regex war für mich übrigens bisher die .htaccess-Datei.
Ich schätze es, dass Sie nicht nur auf Kommentare in Ihrem Blog antworten, sondern dass Ihre Antworten gut durchdacht und sinnvoll sind. Großartige Arbeit.
Danke Laurence.
Großes Argument ... aber das ist ein Teil der Schönheit von Regex. Ich meine, Sie müssen es gar nicht verwenden ... aber wie ich in meiner ersten Antwort sagte, könnten Sie eine extrem leichtgewichtige Regex machen, die nur erzwingt, dass sie Ziffern und Bindestriche oder so eingeben.
Ja, die Verwendung von Regex mit der RedirectMatch-Direktive ist extrem nützlich ... sie macht es so einfach, URL-Strukturen zuzuordnen. Es ist besonders wichtig, dies zu verwenden, wenn Sie eine Website migrieren, bei der sich die Links alle ändern werden ... Ich meine, wenn Sie keine Art von URL-Zuordnung wie RedirectMatch verwenden, kann Ihr SEO bei der Migration Ihrer Website dramatisch leiden.
Blair,
Vielen Dank für diesen Beitrag! Ich vermeide immer reguläre Ausdrücke, weil ich mir nie die Zeit genommen habe, die Syntax zu verstehen. Dies bricht es wirklich nach unten und macht es einfach.
Ich habe keine Angst mehr vor regulären Ausdrücken 🙂
Großartig, Jamie! Ich bin froh, dass ich helfen konnte!