Key Takeaways
- reguläre Ausdrücke (REGEX) sind ein wertvolles Instrument für Entwickler, das für Aufgaben wie Protokollanalyse, Validierung der Formulare und Ersetzen von Operationen verwendet und ersetzt wird. Das Verständnis des effektiven Aufbaus und der Verwendung von Regex kann die Produktivität und Effizienz erheblich verbessern.
- Ein guter Regex beinhaltet die Definition eines Szenarios, die Entwicklung eines Plans und die Implementierung/Testen/Refactoring. Es ist wichtig zu verstehen, welche Arten von Charakteren erlaubt sind, wie oft ein Charakter erscheinen muss und alle Einschränkungen folgen.
- Praktische Beispiele für die Regex -Verwendung umfassen das Abpassen eines Kennworts, eine URL, ein bestimmtes HTML -Tag und duplizierte Wörter. Diese Beispiele zeigen die Verwendung von Zeichenbereichen, Behauptungen, Bedingungen, Gruppen und mehr.
- Während Regex ein leistungsstarkes Werkzeug ist, kann es auch komplex und schwer zu verwalten sein. Daher ist es manchmal effektiver, mehrere kleinere Regex anstelle eines großen zu verwenden. Die Beachtung von Gruppenaufnahmen kann auch die Übereinstimmungen für die weitere Verarbeitung nützlicher machen.
Regelmäßige Ausdrücke werden häufig verwendet, um Suchvorgänge durchzuführen, Substrings zu ersetzen und String -Daten zu validieren. Dieser Artikel enthält Tipps, Tricks, Ressourcen und Schritte, um komplizierte regelmäßige Ausdrücke durchzuführen.
Wenn Sie nicht über die grundlegenden Fähigkeiten verfügen, können Sie Regex mit unserem Anfängerleitfaden lernen. So arkan auch regelmäßig aussehen, es dauert nicht lange, bis Sie die Konzepte lernen.
Es gibt viele Bücher, Artikel, Websites, die regelmäßige Ausdrücke erklären. Anstatt eine weitere Erklärung zu schreiben, würde ich es vorziehen, direkt zu praktischeren Beispielen zu gehen:
- Abgleichen eines Passworts
- passen eine URL
ab
- Abgleichen eines bestimmten HTML -Tags
- Matching duplizierte Wörter
Auf diesem Link finden Sie ein nützliches Cheat -Blatt. Zusammen mit einer Vielzahl nützlicher Ressourcen gibt es am Ende dieses Beitrags auch ein Konferenzvideo von Lea Verou - es ist ein bisschen lang, aber es ist hervorragend, Regex aufzubrechen.
wie man einen guten Regex baut
Regelmäßige Ausdrücke werden häufig in der täglichen Routine des Entwicklers verwendet - Protokollanalyse, Validierung der Formulare, Finden und Ersetzen usw. Deshalb sollte jeder gute Entwickler wissen, wie man sie benutzt, aber was ist die beste Praxis, um eine gute Regex aufzubauen?
1. Definieren Sie ein Szenario
Wenn Sie die natürliche Sprache verwenden, um das Problem zu definieren, erhalten Sie eine bessere Vorstellung von dem Gebrauchsansatz. Die Wörter könnten und müssen, die in einer Definition verwendet werden, nützlich, um obligatorische Einschränkungen oder Behauptungen zu beschreiben.
Unten ist ein Beispiel:
- Die Zeichenfolge muss mit "H" beginnen und mit "o" (z. B. Hallo, Halo).
- Die Zeichenfolge könnte in Klammern verpackt werden.
2. Entwickeln Sie einen Plan
Nach einer guten Definition des Problems können wir die Art von Elementen verstehen, die an unserem regulären Ausdruck beteiligt sind:
- Welche Arten von Zeichen erlaubt (Wort, Ziffer, neue Zeile, Bereich,…)?
- Wie oft muss ein Charakter erscheinen (ein oder mehrere einmal,…)?
- Gibt es einige Einschränkungen, die folgen müssen (Optionen, Lookahead/Hinten, if-then-else,…)?
3. Implement/testen/refactor
Es ist sehr wichtig, eine Echtzeit-Testumgebung zu haben, um Ihren regulären Ausdruck zu testen und zu verbessern. Es gibt Websites wie regex101.com, regexr.com und debuggex.com, die einige der besten Umgebungen bieten.
Um die Effizienz des Regex zu verbessern, können Sie versuchen, einige dieser zusätzlichen Fragen zu beantworten:
- Sind die Zeichenklassen für die spezifische Domäne korrekt definiert?
- Soll ich mehr Testketten schreiben, um mehr Anwendungsfälle abzudecken?
- Ist es möglich, einige Probleme zu finden und zu isolieren und separat zu testen?
- Sollte ich meinen Ausdruck mit Subpattern, Gruppen, Bedingungen usw. neu aufstellen, um ihn kleiner, klarer und flexibler zu machen?
Praktische Beispiele
Das Ziel der folgenden Beispiele ist es nicht, einen Ausdruck zu schreiben, der das Problem nur löst, sondern den effektivsten Ausdruck für die spezifischen Anwendungsfälle unter Verwendung wichtiger Elemente wie Charakterbereichen, Behauptungen, Bedingungen, Gruppen usw.
Abgleichen eines Passworts

Szenario:
- 6 bis 12 Zeichen lang
- muss mindestens einen Großbuchstaben haben
- muss mindestens einen unteren Fallbrief haben
- muss mindestens eine Ziffer
haben
- sollte andere Zeichen enthalten
Muster:
^(? =.*[a-z]) (? =.*[a-z]) (? =.*d). {6,12} $
Dieser Ausdruck basiert auf mehreren positiven Lookahead (? = (Regex)). Der Lookahead passt zu etwas, gefolgt von der Deklared (Regex). Die Reihenfolge der Bedingungen wirkt sich nicht auf das Ergebnis aus. Ausdrucksformen sind sehr nützlich, wenn es mehrere Bedingungen gibt.
Wir könnten auch den negativen Lookahead (?! (Regex)) verwenden, um einige Charakterbereiche auszuschließen. Zum Beispiel könnte ich den % mit (?!.*#) Ausschließen.
Erklären wir jedes Muster des obigen Ausdrucks:
- ^ behauptet die Position zu Beginn der Zeichenfolge
- (?
- .* Übereinstimmt jedem Zeichen (außer Newline) zwischen Null und unbegrenzten Zeiten
- [a-z] entspricht einem einzelnen Zeichen im Bereich zwischen A und Z (Fallempfindlichkeit)
- (?
- .* Übereinstimmt jedem Zeichen (außer Newline) zwischen Null und unbegrenzten Zeiten
- [a-z] entspricht einem einzelnen Zeichen zwischen A und Z (Fallempfindlichkeit)
- (?
- .* Übereinstimmt jedem Zeichen (außer Newline) zwischen Null und unbegrenzten Zeiten
- D entspricht einer Ziffer [0-9]
- . {6,12}entspricht jedem Charakter (außer Newline) zwischen 6 und 12 -mal
- $ behauptet die Position am Ende der Zeichenfolge
passende URL

Szenario:
- muss mit http oder https oder ftp beginnen, gefolgt von: //
- muss mit einem gültigen Domänennamen
übereinstimmen
- könnte eine Portspezifikation (http://www.sitepoint.com:80)
enthalten
- könnte Ziffer, Buchstaben, Punkte, Bindestriche, Vorwärts -Schrägstriche, mehrmals
enthalten
Muster:
^(http | https | ftp): [/] {2} ([a-za-z0-9-.]. [a-za-z] {2,4}) (: [0-9])? /? ([a-za-z0-9 -._?, '/\ & amp;%$#= ~]*)
Das erste Szenario ist ziemlich einfach mit ^(http | https | ftp): [/] {2}.
Um dem Domainnamen zu entsprechen, müssen wir berücksichtigen, dass es nur Buchstaben, Ziffern, Bindestriche und Punkte enthalten kann. In meinem Beispiel habe ich die Anzahl der Zeichen nach der Zeichensetzung von 2 auf 4 eingeschränkt, könnte aber für neue Domänen wie .Rocks oder .codes erweitert werden. Der Domänenname wird mit ([a-za-z0-9-
Die optionale Portspezifikation wird vom einfachen (: [0-9]) übereinstimmt?
Eine URL kann mehrere Male wiederholt werden (siehe RFC3986). Dies wird mit einer Reihe von Zeichen in einer Gruppe übereinstimmt ([A-Za-Z0-9 -._?, '/\ & Amp;%$ #= ~]*).
Es ist wirklich nützlich, jedem wichtigen Element mit einem Gruppencapture () zu entsprechen, da es nur die von uns benötigten Übereinstimmungen zurückgibt. Denken Sie daran, dass bestimmte Charaktere entkommen müssen.
Im Folgenden erklärte jedes einzelne Subpatter:
- ^ behauptet die Position zu Beginn der Zeichenfolge
- Erfassungsgruppe (http | https | ftp), erfasst http oder https oder ftp
- : entkommenem Charakter, entspricht dem Charakter: buchstäblich
- [ /] {2} stimmt genau das 2 -fache mit dem entkommenen Zeichen /
überein
- Erfassungsgruppe ([a-za-z0-9-.]. [A-za-z] {2,4}):
- [a-za-z0-9- buchstäblich
- . entspricht dem Charakter. buchstäblich
- [a-za-z] {2,4}entspricht einem einzelnen Zeichen zwischen 2 und 4 -mal zwischen A und Z oder A und Z (Fallempfindlichkeit)
- Gruppe erfassen (: [0-9]) ?:
- Quantifizierer? entspricht der Gruppe zwischen Null oder mehrmals
- : Passt zum Charakter: buchstäblich
- [0-9] entspricht einem einzelnen Zeichen zwischen 0 und 9 ein oder mehrmals
- /? entspricht dem Charakter / buchstäblich Null oder einmal
- Gruppe erfassen ([a-za-z0-9 -._?, '/\ & Amp;%$#= ~]*):
- [a-za-z0-9 -._? : -._?, '/ & amp;%$#= ~.
Übereinstimmung mit HTML -Tag

Szenario:
- Das Start -Tag muss mit
enden
- Das End -Tag muss mit gefolgt von einem oder mehreren Zeichen beginnen und mit>
enden
- Wir müssen den Inhalt in einem Tag -Element
übereinstimmen
Muster:
(.*?) 1>
Wenn Sie das Start -Tag und den Inhalt im Inhalt entsprechen, ist es mit
Beginnen Sie mit
Erfassen Sie den Tag -Namen
gefolgt von einem oder mehreren Zeichen
Erfassen Sie den Inhalt innerhalb des Tags
Das Schluss -Tag muss -Name vor> erfasst werden
Einbezogen nur zwei Erfassungsgruppen in den Ausdruck, den Tag -Namen und den Inhalt, werden eine sehr klare Übereinstimmung zurückgeben, eine Liste von Tag -Namen mit zugehörigen Inhalten.
Lassen Sie uns ein wenig tiefer graben und das Untermaterial erklären:
-
-
Gruppe erfassen ([w]) entspricht jedem Wortzeichen a-za-z0-9_ ein oder mehrmals -
.* Übereinstimmt jedem Zeichen (außer Newline) zwischen Null oder mehrmals -
> entspricht dem Charakter> buchstäblich -
Gruppe erfassen (.*?), Entspricht einem Zeichen (außer Newline), Null und öfter -
- / entspricht dem Charakter / buchstäblich
- 1 entspricht dem gleichen Text, der von der ersten Erfassungsgruppe übereinstimmt: ([w])
> entspricht den Zeichen> buchstäblich

Matching duplizierte Wörter
-
Szenario:
- Die Wörter sind Raum getrennt
Wir müssen jede Duplikation übereinstimmen-nicht aufeinanderfolgende
Muster:
B (w) b (? =.*1)
Dieser reguläre Ausdruck scheint eine Herausforderung zu sein, verwendet jedoch einen Teil des zuvor gezeigten Konzepts.
Das Muster führt das Konzept der Wortgrenzen ein.
Eine Wortgrenze B überprüft hauptsächlich Positionen. Es stimmt mit einem Wortcharakter (d. H. Abcde) überein, gefolgt von einem Nicht -Wort -Charakter (dh: -~,!).
Im Folgenden finden Sie einige Beispiele der Wortgrenze, um es klarer zu machen:
- Angesichts des Ausdrucks sind reguläre Ausdrücke fantastisch
- Die Muster -Bareb -Übereinstimmungen sind
- Das Muster W {3} B könnte mit den letzten drei Buchstaben der Wörter übereinstimmen: Lar, Ion, sind, OME
Der obige Ausdruck könnte erklärt werden als:
- Übereinstimmung mit jedem Wortcharakter, gefolgt von einem Nicht-Wort-Charakter (in unserem Fallraum)
- Überprüfen Sie, ob das übereinstimmende Wort bereits vorhanden ist oder nicht
Im Folgenden finden Sie die Erklärung für jedes Sub -Muster:
- b Wortgrenze
- Gruppe erfassen ([w]) entspricht jedem Wortzeichen a-za-z0-9_
- b Wortgrenze
- (?
- .* Übereinstimmt jedem Zeichen (außer Newline)
- 1 entspricht demselben Text wie der erste Erfassungsgruppe
Der Ausdruck wird sinnvoller sein, wenn wir alle Übereinstimmungen zurückgeben, anstatt nur den ersten zurückzugeben. Weitere Informationen finden Sie in der PHP -Funktion preg_match_all.
endgültige Gedanken
Regelmäßige Ausdrücke sind zweischneidige Schwerter. Je mehr Komplexität hinzugefügt wird, desto schwieriger ist es, das Problem zu lösen. Aus diesem Grund ist es manchmal schwierig, einen regulären Ausdruck zu finden, der allen Fällen übereinstimmt, und es ist besser, stattdessen mehrere kleinere Regex zu verwenden.
Ein gutes Szenario des Problems könnte sehr hilfreich sein und es Ihnen ermöglicht, über den Charakterbereich, die Einschränkungen, Behauptungen, Wiederholungen, optionale Werte usw. nachzudenken. Wenn Sie den Gruppenaufnahmen mehr Aufmerksamkeit schenken, nützt die Übereinstimmungen für die weitere Verarbeitung nützlich. Fühlen Sie sich frei, die Ausdrücke in den Beispielen zu verbessern und teilen Sie uns mit, wie Sie es tun!
Nützliche Ressourcen
Im Folgenden finden Sie weitere Informationen und Ressourcen, um Ihre Regex -Fähigkeiten zu wachsen.
Fühlen Sie sich frei, dem Artikel einen Kommentar hinzuzufügen, wenn Sie etwas Nützliches finden, das nicht aufgeführt ist.
Lea Verou - /reg (exp) {2}LAUPE/: Entmystifizierende reguläre Ausdrücke
https://www.youtube.com/watch?v=eklues9rvak
PHP -Bibliotheken
Name |
Beschreibung |
Regexpbuilder
Erstellt Regex mit menschlich-lesbaren Methodenketten
Noonoofluentregex
Erstellt Regex -Ausdrücke mit fließenden Setzen und Begriffen mit englischer Sprache wie oben
Hoaregex
Bietet Tools zur Analyse von Regex und Generierung von Zeichenfolgen
Regex umgekehrt
Bei einem regulären Ausdruck erzeugt eine Zeichenfolge
Websites
url |
Beschreibung |
regex101.com
PCRE Online Regex Tester
regextester.com
PCRE Online Regex Tester
rexv.org
PCRE Online Regex Tester
debuggex.com
Unterstützt PCre und bietet einen sehr nützlichen visuellen Regex -Debugger
regexper.com
Regex im JavaScript -Stil, aber nützlich für Debugg
PhpliveRegex.com
Online -Tester für PREG -Funktionen
Regxlib.com
Datenbank mit regulären Ausdrücken, die verwendet werden,
reguläre Expressionen.info
Regex -Tutorials, Bücherbewertung, Beispiele
Bücher
Titel |
Beschreibung |
Autor |
Editor |
Beherrschen reguläre Ausdrücke
Das muss Regex -Buch haben
Jeffrey Friedl
O’Reilly
Regelmäßige Ausdrucks -Taschenreferenz
Reguläre Ausdrücke für Perl, Ruby, PHP, Python, C, Java und .NET
Tony StubbleBine
O’Reilly
häufig gestellte Fragen (FAQs) zu regulären Ausdrücken (REGEX)
Was sind einige praktische Anwendungen von regulären Ausdrücken (REGEX)? Sie werden häufig in der Datenvalidierung verwendet, um sicherzustellen, dass die Eingabe der Benutzer mit einem bestimmten Format übereinstimmt, z. B. eine E -Mail -Adresse oder Telefonnummer. Sie können auch im Web -Scraping verwendet werden, um bestimmte Informationen aus einer Webseite zu extrahieren. Darüber hinaus kann Regex in der Textverarbeitung für Aufgaben wie das Finden und Austausch bestimmter Textzeichenfolgen, die Aufteilung einer Zeichenfolge in ein Array von Substrings und mehr verwendet werden.
Das Erstellen komplexer regulärer Ausdrücke beinhaltet das Verständnis und die Kombination verschiedener Regex -Komponenten. Dazu gehören Literale, Charakterklassen, Quantifizierer und Metacharaccters. Indem Sie diese Komponenten auf unterschiedliche Weise kombinieren, können Sie regelmäßige Ausdrücke erstellen, die zu einer Vielzahl von Mustern passen. Sie können beispielsweise einen regulären Ausdruck erstellen, der E -Mail -Adressen, Telefonnummern oder URLs entspricht.
Was sind einige häufige Fehler, die bei der Verwendung regelmäßiger Ausdrücke (Regex) zu vermeiden sind. *), was zu unerwarteten Ergebnissen führen kann. Ein weiterer häufiger Fehler ist nicht ordnungsgemäß den Sonderfiguren, wenn sie wörtlich interpretiert werden sollen. Darüber hinaus ist es wichtig, sich daran zu erinnern, dass regelmäßige Ausdrücke standardmäßig von Fall sensitiv sind. Sie müssen daher die entsprechenden Flags verwenden, wenn Sie den Fall ignorieren möchten.
Wie kann ich meine regulären Ausdrücke (Regex) testen? >
Es gibt mehrere Online -Tools, mit denen Sie Ihre regulären Ausdrücke testen können. Mit diesen Tools können Sie in der Regel einen regulären Ausdruck und eine Testzeichenfolge eingeben und dann die Teile der Testzeichenfolge hervorheben, die dem regulären Ausdruck entsprechen. Dies kann eine großartige Möglichkeit sein, Ihre regulären Ausdrücke zu debuggen und sicherzustellen, dass sie wie erwartet arbeiten. Ausdrücke in irgendeiner Form. Die spezifischen Syntax und die unterstützten Funktionen können jedoch zwischen den Sprachen variieren. Zum Beispiel unterstützen JavaScript, Python und Ruby alle regulären Ausdrücke, aber sie haben jeweils ihre eigene einzigartige Syntax und Funktionen. Obwohl reguläre Ausdrücke unglaublich leistungsfähig sein können, können sie auch ressourcenintensiv sein, wenn sie nicht ordnungsgemäß verwendet werden. Die Ausführung von komplexen regulären Ausdrücken kann lange dauern, insbesondere bei großen Textketten. Daher ist es wichtig, regelmäßige Ausdrücke mit Bedacht zu verwenden und sie so weit wie möglich zu optimieren.
Wie kann ich meine regulären Ausdrücke (Regex) optimieren? Dazu gehören die Vermeidung unnötiger Quantifizierer, die Verwendung von Nicht-Rückfallgruppen, wenn Sie den übereinstimmenden Text nicht benötigen, und die Verwendung von Zeichenklassen anstelle von Wechsel, wo möglich. Darüber hinaus bieten einige regelmäßige Expressionsmotoren Optimierungsfunktionen wie faule Quantifizierer, die die Leistung verbessern können. verfügbar, um mehr über reguläre Ausdrücke zu erfahren. Dazu gehören Online -Tutorials, Bücher und interaktive Lernplattformen. Darüber hinaus verfügen viele Programmiersprachen über umfangreiche Dokumentation zu ihrer regulären Ausdrucksyntax und -funktionen. Um HTML oder XML zu analysieren, wird dies im Allgemeinen nicht empfohlen. Dies liegt daran, dass HTML und XML eine verschachtelte Struktur haben, die mit regulären Ausdrücken schwer genau erfassen kann. Stattdessen ist es normalerweise besser, einen dedizierten HTML- oder XML -Parser zu verwenden.
Was sind einige Alternativen zu regulären Ausdrücken (Regex)? Abhängig von der vorliegenden Aufgabe sind Sie möglicherweise besser dran, einen anderen Ansatz zu verwenden. Beispielsweise können Sie für einfache String-Manipulationsaufgaben möglicherweise integrierte String-Methoden anstelle von regulären Ausdrücken verwenden. Für das Parsen von HTML oder XML verwenden Sie normalerweise einen speziellen Parser. Und für komplexe Textverarbeitungsaufgaben möchten Sie möglicherweise in Betracht ziehen, eine Bibliothek für natürliche Sprachverarbeitung zu verwenden.
Das obige ist der detaillierte Inhalt vonEntmystifizierende Regex mit praktischen Beispielen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!