Ich habe ein Geständnis, das Regex-Puristen zusammenzucken wird: In den ersten Jahren meiner Karriere schrieb ich regelmäßige Ausdrücke, indem ich aus dem Stapelüberlauf kopierte, einen Charakter änderte, den Code ausführte, ihn scheiterte und wiederholte, bis es funktionierte. Ich habe die Muster nicht verstanden - ich habe sie zur Unterwerfung gemobbt. Es war langsam und schlimmer noch, die Muster, die ich versendete, waren auf eine Weise zerbrechlich, die ich nicht sehen konnte.
Was das Problem behoben hat, war nicht die Theorie zu lesen (obwohl ich es schließlich tat). Es war ein visueller Tester - ein Feld, in dem ich das Muster eintippe, ein Feld, in das ich Testsaiten einfüge und die aufleuchtet, sobald ich etwas ändere. Plötzlich konnte ich sich vorstellen wieso \d+ Mehr als ich wollte, oder warum mein E-Mail-Muster eine vollkommen gültige Adresse lehnte. Regex war kein Ratespiel und wurde zu einer engen Rückkopplungsschleife.
Genau das ist das Regex-Builder auf toolz.dev ist. Sie schreiben ein Muster, lassen Testdaten einfügen, schalten Flags um und beobachten die Matches und erfassten Gruppen in Echtzeit hervorheben. Es läuft vollständig in Ihrem Browser, sodass die Log-Linien oder Benutzerdaten, gegen die Sie testen, niemals irgendwo hochgeladen werden. Dieser Leitfaden ist die Regex-Referenz, die ich mir damals wünschte - die Muster, die ich tatsächlich wiederverwende, ein vollständiger Spickzettel und der einzige Fehler, der einen Produktionsserver beseitigen kann.
tl; dr: Fügen Sie Ihr Muster und testen Sie Zeichenfolgen in die Regex-Builder und schalte die
g/i/mFlags, um Spiele zu sehen, leuchten live hervor. Starten Sie einfach, fügen Sie Einschränkungen hinzu, um falsche positive Ergebnisse zu beenden, und testen Sie kontroverse Eingaben, um katastrophale Rückverfolgung zu vermeiden. Bei extrahierten Daten koppeln Sie sie mit JSON-Formater und Base64-Konverterdrohen Alle clientseitig, alles kostenlos.
Was genau ist ein regulärer Ausdruck?
Ein regulärer Ausdruck - Regex oder RegExp - ist eine kompakte Zeichenfolge, die ein Suchmuster beschreibt. Anstelle von "das Wort katze" finden Sie "Finden Sie jede fünfstellige Zahl" und "finden Sie alles, was wie eine E-Mail aussieht" oder "jede Zeile, die mit Fehler beginnt." Fast jede Sprache und jeder Editor unterstützt sie, was die Fähigkeit so tragbar macht: Lernen Sie sie einmal und verwenden Sie sie in JavaScript, Python, grepund Ihre IDE finden und ersetzen.
Das Konzept stammt aus der formalen Sprachtheorie aus den 1950er Jahren, und Ken Thompson hat es in den 1960er Jahren für die Textbearbeitung mit dem Computer verbunden. Diese Geschichte ist aus einem praktischen Grund wichtig, auf den ich zurückkommen werde: "Reguläre" Sprachen haben Grenzen, weshalb Regex wirklich keine geschachtelten Strukturen wie HTML analysieren kann, egal wie klug Sie werden.
Wo ich in einer normalen Woche nach Regex greife: Überprüfen der Benutzereingaben, bevor sie in die Datenbank trifft, Felder aus unstrukturierten Protokollzeilen zu ziehen, das Suchen und Ersetzen in einer ganzen Codebasis, die eine einfache Suche nicht ausdrücken kann, und das Filtern von Daten während einer Migration. der Regex-Builder Hier prototype ich jeden von denen, bevor er annähernd echten Code angeht.
Hier sind die grundlegenden Bausteine – das Alphabet, aus dem Sie Muster zusammenstellen:
| Satzsprache | Bedeutung | Beispiel | Streichhöl |
|---|---|---|---|
. |
Jeder Charakter außer der Newline | h.t |
Hut, heiß, getroffen |
\d |
Beliebige Ziffer (0-9) | \d{3} |
123, 456 |
\w |
Wortzeichen (A-Z, A-Z, 0-9, _) | \w+ |
Hallo, test_123 |
\s |
Jeder Leerzeichen | hello\sworld |
Hallo Welt |
^ |
Zeichenfolge | ^Hello |
Hallo am Anfang |
$ |
Ende der Saite | end$ |
am Ende enden |
* |
Null oder mehr | ab*c |
AC, ABC, ABBC |
+ |
ein oder mehrere | ab+c |
ABC, ABBC |
? |
Null oder Eins | colou?r |
Farbe, Farbe |
{n} |
genau n mal | \d{4} |
2026 |
{n,m} |
zwischen n und m | \d{2,4} |
12, 123, 1234 |
[abc] |
Charakterklasse | [aeiou] |
Jeder Vokal |
[^abc] |
negierte Klasse | [^0-9] |
jede nicht Ziffer |
(...) |
Erfassungsgruppe | (hello) |
Fängt "Hallo" ein |
a|b |
Wechsel (oder) | cat|dog |
Katze oder Hund |
Welche Regex-Muster sollte jeder Entwickler griffbereit haben?
Dies sind diejenigen, die ich getestet, kaputt, repariert habe und jetzt in einer persönlichen Snippet-Datei aufbewahre. Kopieren Sie sie direkt in die Regex-Builder Und werfen Sie Ihre eigenen Kantenkoffer auf sie.
E-Mail (die praktische Art)
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
das passt [email protected] und [email protected], und lehnt ab @example.com oder user@comdrohen Hier ist jedoch die wichtige Ehrlichkeit: die vollständige E-Mail-Grammatik in RFC 5322 ist monströs komplex - es erlaubt technisch zitierten Zeichenfolgen und Kommentare, die fast niemand benutzt. Verfolgen Sie nicht die 100% ige RFC-Konformität mit einem Regex. Ordnen Sie die praktischen 99% dem obigen Muster zu und bestätigen Sie dann, dass die Adresse echt ist, indem Sie eine Bestätigungs-E-Mail senden. Das ist der Fehler, den ich am meisten sehe: Teams, die Tage auf einem "luftdichten" E-Mail-Regex brennen, der immer noch keinen echten Posteingang von einem Tippfehler unterscheiden kann.
URL
^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&\/=]*)$
Streichhöl https://toolz.dev und http://www.example.com/path?query=value;; lehnt ab ftp://... und Klartext.
US-Telefonnummer
^(\+1)?[-.\s]?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$
flexibel genug für 555-123-4567, (555) 123-4567, +1 555.123.4567, und 5551234567drohen
IPv4-Adresse
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Der verschachtelte Wechsel erzwingt, dass jedes Oktett in 0–255 bleibt, also wird es korrekt zurückgewiesen 999.999.999.999drohen
starke Passwortprüfung
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$
Erfordert mindestens 8 Zeichen mit einem Kleinbuchstaben, einem Großbuchstaben, einer Ziffer und einem Symbol. der (?=...) Lookaheads behaupten jeweils eine Bedingung, ohne Charaktere zu konsumieren - ein netter Trick, der es wert ist, verstanden zu werden.
ISO-Datum (JJJJ-MM-TT)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
Streichhöl 2026-07-11, lehnt ab 2026-13-01 und 2026-02-32drohen
Sechskantfarbe
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
Streichhöl #4466EE, #abc, #000000drohen
Das Regex-Spickzettel
Halten Sie dies fest. Es ist die Referenz, die ich am meisten überprüfe.
Anker
| Muster | Beschreibung |
|---|---|
^ |
Zeichenfolge (oder Linie im Mehrlinienmodus) |
$ |
Ende der Zeichenfolge (oder Linie im Mehrlinienmodus) |
\b |
Wortgrenze |
\B |
Nicht-Wort-Grenze |
Quantifizierer
| Muster | Beschreibung |
|---|---|
* |
0 oder mehr (Gierig) |
+ |
1 oder mehr (Gierig) |
? |
0 oder 1 (gierig) |
*? +? ?? |
Faule Versionen - so wenig wie möglich übereinstimmen |
{n} {n,} {n,m} |
genau n / n oder mehr / zwischen n und m |
Charakterklassen
| Muster | Beschreibung |
|---|---|
[abc] |
A, B oder C |
[^abc] |
nicht a, b oder c |
[a-z] [A-Z] [0-9] |
Schablone |
\d \D |
Ziffer / nicht Ziffer |
\w \W |
Wort-Char / Nicht-Wort-Char |
\s \S |
Leerzeichen / Nicht-Whitespace |
Gruppen und schauen
| Muster | Beschreibung |
|---|---|
(abc) |
Gruppe erfassen |
(?:abc) |
Nicht erfassende Gruppe |
(?<name>abc) |
Erfassungsgruppe benannt |
(?=abc) / (?!abc) |
Positive / negative Aussicht |
(?<=abc) / (?<!abc) |
Positiv / Negativer BlickBehind |
Flagge
| Fahne | Beschreibung |
|---|---|
g |
Global – Alle Übereinstimmungen finden |
i |
falls unempfindlich |
m |
Mehrzeilig — ^ und $ Liniengrenzen übereinstimmen |
s |
Dotall - . Passt zu Newlines |
u |
Unicode-Unterstützung |
Wie baut und debuggt man ein Muster, ohne eine Stunde zu verlieren?
Mein Prozess ist absichtlich langweilig, weil langweilig ist:
- Beginnen Sie mit der einfachsten Sache, die einem echten Beispiel entspricht. Versuchen Sie nicht, jeden Fall auf einmal zu behandeln.
- Füge sowohl positive als auch negative Testzeichenfolgen ein in das Regex-Builder - Dinge, die zusammenpassen sollten und Dinge, die nicht dürfen.
- Ziehen Sie fest, um falsche positive Ergebnisse zu töten. Anker hinzufügen (
^,$) Also passt das Muster zur gesamten Zeichenfolge und tauscht.für bestimmte Klassen wie[a-z]oder[^,]drohen - Wirf einen kontroversen Input darauf — Leere Zeichenfolgen, riesige Eingaben, Unicode- und Literal-Regex-Zeichen als Daten.
- Erst dann optimieren.
Wenn sich etwas schlecht benimmt, ist es fast immer eines von drei Dingen. Wenn es Passt zu viel, Ihre Quantifizierer sind gierig - machen Sie sie faul (*?) oder Ihre Klassen spezifischer. Wenn es Passt zu wenig, Sie brauchen wahrscheinlich die i Flagge oder vergessen, einem Sonderzeichen zu entkommen. Wenn es passt überhaupt nichts, prüfen Sie auf nicht entweichte Metazeichen (., *, +, (, [, {, usw.) als wörtliche oder unsichtbare Zeichen wie Registerkarten, die sich in Ihrer Testzeichenfolge verstecken.
Was ist katastrophales Backtracking und warum sollten Sie es fürchten?
Dies ist der Abschnitt, den ich auf neue Entwickler tätowieren würde, wenn ich könnte. Schon früh habe ich einen Input-Validation-Regex ausgeliefert, der völlig unschuldig aussah, und eines Nachmittags schloss eine einzige Anfrage einen CPU-Kern an 100% an und blieb dort. Das Muster war das Problem.
Wenn eine Regex-Engine keine Übereinstimmung finden kann, ist dies eine Rückschritt - Es zieht sich zurück und versucht andere Wege, um das Muster zu befriedigen. Bestimmte Formen lassen die Anzahl der Pfade exponentiell explodieren. Das Lehrbuchbeispiel:
^(a+)+$
Füttere das eine Eingabe wie aaaaaaaaaaaaaaaaaaaab (eine Reihe von a Ende in einem b), und die verschachtelten Quantifizierer geben dem Motor eine astronomische Anzahl von Möglichkeiten, die as, die alle es ausprobieren, bevor "keine Übereinstimmung" abgeschlossen wird. Ihre App friert ein. Dies ist eine echte Denial-of-Service-Klasse namens Überlieferungen (Reguläre Ausdrucksverweigerung) und Angreifer nutzen es aus.
So bleiben Sie sicher:
- Nieten Sie Quantifizierer.
(a+)+,(a*)*, und(a+)*sind rote Fahnen. - Verwenden Sie Atomgruppen oder besitzergreifende Quantifizierer Wo der Motor sie unterstützt:
(?>a+)odera++drohen - Sei genau.
[a-z]+rückt weniger als zurück.+Weil es weniger Wege zu erkunden gibt. - Verankern Sie Ihre Muster So versagt der Motor bei nicht passenden Eingaben schnell.
- Testen Sie mit Saiten, die fast übereinstimmen, aber am Ende fehlschlagen - Das ist der schlimmste Fall für das Backtracking.
Wenn Sie unterwegs sind, gibt es dieses Problem einfach nicht, was mich zum nächsten Abschnitt bringt.
Wie unterscheidet sich Regex zwischen den Sprachen?
Die Kernsyntax läuft gut, aber die Details beißen. Das sind die Unterschiede, die ich tatsächlich überstanden habe.
Javascript:
const regex = /\d{3}-\d{4}/g;
const pattern = new RegExp('\\d{3}-\\d{4}', 'g'); // note the doubled backslashes
'555-1234'.match(regex); // ["555-1234"]
const m = '2026-07-11'.match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/);
m.groups.year; // "2026"
Achtung: Lookbehind erst im ES2018 angekommen, \d Entspricht nur ASCII-Ziffern und g Flagge macht .test() Zustand über lastIndex — Eine subtile Fehlerquelle in Schleifen.
Python:
import re
pattern = re.compile(r'\d{3}-\d{4}') # raw strings avoid double-escaping
pattern.findall('Call 555-1234 or 555-5678') # ['555-1234', '555-5678']
Verwenden Sie immer rohe Zeichenfolgen (r'...').). sich etw re.match Nur Anker am Anfang — verwenden re.search überall zu finden. und re.VERBOSE Ermöglicht das Schreiben von mehrzeiligen, kommentierten Mustern, was für komplexere Kommentare gilt.
PHP: Muster brauchen Trennzeichen ('/\d{3}-\d{4}/'), nutzt es die leistungsstarke PCRE-Engine und preg_match Retouren 1, 0, oder false ON FEHLER - Also überprüfen Sie mit ===drohen
Geh: Verwendet den RE2-Motor, der bewusst Drops Lookaheads, LookHinds und Backreferences Im Gegenzug für eine Garantie der linearen Zeitanpassung. Das bedeutet, dass kein katastrophales Backtracking überhaupt möglich ist - ein wirklich anderer Kompromiss, der es wert ist, wenn Sie eine Sprache für nicht vertrauenswürdige Eingaben auswählen.
Ein echtes Beispiel: Analysieren einer Apache-Logzeile
Hier ist die Art von Sache, in der Regex wirklich großartig ist. Eine Standard-Logzeile von Apache Access sieht aus wie:
192.168.1.1 - frank [11/Jul/2026:10:27:10 -0500] "GET /api/users HTTP/1.1" 200 1234
Dieses Muster zieht es auseinander:
^(\S+) \S+ (\S+) \[([^\]]+)\] "(\S+) (\S+) (\S+)" (\d{3}) (\d+)$
beides einfügen in die Regex-Builder Und jede erfasste Gruppe leuchtet separat:
| Gruppe | Inhalt | Beispiel |
|---|---|---|
| 1 | IP-Adresse | 192.168.1.1 |
| 2 | Benutzername | freimütig |
| 3 | Zeitstempel | 11. Juli/2026:10:27:10 -0500 |
| 4 | HTTP-Methode | bekommen |
| 5 | Pfad anfordern | /api/users |
| 6 | HTTP-Version | http / 1.1 |
| 7 | Statuscode | 200 |
| 8 | Antwortgröße | 1234 |
Sobald die Gruppen im Tester aufgestellt sind, übersetzen Sie sie in a re.findall in Python oder a match() In JavaScript ist trivial - und Sie wissen bereits, dass es funktioniert.
Häufig gestellte Fragen
Was ist ein Regex-Builder?
Ein Regex Builder ist ein interaktives Tool, bei dem Sie einen regulären Ausdruck eingeben und sofort mit Testspuren übereinstimmen, wobei Übereinstimmungen und erfasste Gruppen hervorgehoben werden. Es ersetzt die langsame Schreib-Run-Fail-Rewrite-Schleife in Ihrem Code durch eine Live-Schleife. der Regex-Builder Auf toolz.dev geht das komplett in Ihrem Browser, so bleiben Testdaten auf Ihrem Computer.
Sind Regex-Muster in jeder Programmiersprache identisch?
Die Kernsyntax ist nahezu identisch, aber die Details unterscheiden sich genug, um Fehler zu verursachen. Ältere Javascript fehlte, Gos RE2 Engine hat überhaupt keine Lookaheads oder Backreferences, und Python nennt Gruppen mit (?P<name>...) In einigen Zusammenhängen. Bestätigen Sie immer ein Muster in der Sprache, auf die Sie tatsächlich abzielen, anstatt die Portabilität anzunehmen.
Wie validiere ich eine E-Mail-Adresse mit Regex?
Verwenden Sie ein praktisches Muster wie ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$, die die überwiegende Mehrheit der realen Adressen behandelt. Versuchen Sie nicht, die vollständige RFC 5322-Konformität in einer Regex-Konformität zu erreichen – die Grammatik ist viel zu komplex und Sie werden weiterhin gültige Adressen ablehnen oder Tippfehler akzeptieren. Koppeln Sie die Regex mit einer Bestätigungs-E-Mail, um zu bestätigen, dass der Posteingang tatsächlich vorhanden ist.
Warum friert mein Regex die Anwendung ein?
Fast immer katastrophales Backtracking. Muster mit verschachtelten Quantifizierern wie (a+)+ Erstellen Sie eine exponentielle Anzahl von übereinstimmenden Pfaden, wenn sie Eingaben treffen, die fast übereinstimmen, aber letztendlich fehlschlagen, und die Engine versucht sie alle. Entfernen Sie verschachtelte Quantifizierer, bevor Sie bestimmte Zeichenklassen vor .+, und Anker hinzufügen, damit der Motor schnell ausfallen kann.
Kann ich Regex verwenden, um HTML oder JSON zu analysieren?
Nein, nicht für etwas, das über die triviale Extraktion hinausgeht. HTML und JSON sind keine regulären Sprachen – sie ermöglichen ein beliebiges Nesting, das Regex grundsätzlich nicht nachverfolgen kann. Verwenden Sie einen echten Parser: Domparser oder Cheerio für HTML, und JSON.parse oder ein JSON-Tool für JSON. Regex ist das falsche Werkzeug, sobald die Struktur nisten.
Was ist der Unterschied zwischen gierigem und faulem Matching?
gierige Quantifizierer (*, +, ?) so viel wie möglich nehmen und bei Bedarf zurückfahren; faule (*?, +?, ??) Greifen Sie so wenig wie möglich und erweitern Sie nur, wenn Sie erzwungen werden. gegen <b>bold</b>, gierig <.*> Schluckt die ganze Saite, während sie faul ist <.*?> Halt am ersten <b>drohen Die Auswahl des richtigen ist oft die Lösung, wenn ein Muster zu stark übereinstimmt.
Wie entkomme ich Sonderzeichen in Regex?
Setzen Sie einen Backslash vor jeden Metazeichen, den Sie wörtlich meinen: \., \*, \+, \?, \(, \), \[, \], \{, \}, \^, \$, \|, und \\drohen Die meisten Sprachen bieten auch einen Helfer, um Ihnen eine ganze Zeichenfolge zu entkommen - re.escape() In Python zum Beispiel - das ist sicherer als von Hand zu entkommen, wenn die Zeichenfolge von Benutzereingaben stammt.
Was bedeuten die Regex-Flags G, I und M?
g (global) findet jede Übereinstimmung statt beim ersten Anhalten, i (Fall ignorieren) macht das Muster CASE-unempfindlich, und m (Mehrfach) macht ^ und $ Passen Sie bei jedem Zeilenumbruch an und nicht nur an Beginn und Ende der Zeichenfolge. Sie kombinieren sich also frei, also gim macht alle drei. Ein häufiges Gotcha in Javascript: Wiederverwendung a g Regex über Anrufe trägt lastIndex zwischen ihnen, was macht test() Alternative wahr und falsch - Erstellen Sie das Muster oder setzen Sie das Zurücksetzen lastIndexdrohen
Was ist eine Aussichtsstelle in Regex?
Eine Aussichtsstelle behauptet, dass etwas folgt oder nicht folgt, ohne es zu konsumieren. foo(?=bar) Streichhöl foo nur wenn bar kommt als nächstes; foo(?!bar) Passt nur, wenn es nicht geht. lookbehind ((?<=...), (?<!...)) macht das gleiche rückwärts und ist in modernem Javascript, Python und PCRE gelandet - aber nicht in Gos Re2, das beides direkt ablehnen. Passwortregeln sind die klassische Verwendung: ^(?=.*\d)(?=.*[a-z]).{8,}$ Stapelt Assertions, so dass jede Anforderung unabhängig an derselben Position überprüft wird.
Wie stimme ich eine Telefonnummer mit Regex ab?
Seien Sie für ein bestimmtes Format explizit und nicht klug: ^\(\d{3}\) \d{3}-\d{4}$ Streichhöl (555) 123-4567drohen Um abwechslungsreiche Separatoren zu tolerieren, lassen Sie optionale wie ^\+?1?[-.\s]?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$drohen Die Telefonnummerierung ist in allen Ländern unordentlich. Überprüfen Sie daher nur das Format, das Sie tatsächlich akzeptieren, und normalisieren Sie sie auf Ziffern, bevor Sie es speichern. Erstellen und testen Sie das Muster live, bevor Sie ihm vertrauen.
Abschluss
Regex wurde von meiner gefürchteten Fähigkeit zu einer meiner am häufigsten verwendeten Fähigkeiten, als ich anfing, Muster in einem Live-Tester zu erstellen, anstatt in meinem Editor zu raten. Starten Sie einfach, testen Sie mit realen und kontroversen Inputs, respektieren Sie katastrophale Backtracking und führen Sie eine persönliche Bibliothek mit Mustern, denen Sie vertrauen.
der Regex-Builder Auf toolz.dev macht diese Schleife schnell, mit Echtzeit-Matching, Gruppen-Hervorhebung und Flag-Toggles – alles läuft in Ihrem Browser, damit Ihre Testdaten privat bleiben. Wenn Ihr Muster JSON extrahiert, geben Sie es an die JSON-Formater; ; Wenn es einen Base64-Blob erfasst, dekodieren Sie ihn mit dem Base64-Konverterdrohen Oder stöbern Sie in allen über 600 kostenlosen Tools unter toolz.devdrohen

