Reguläre Ausdrücke -Einführung
Ein regulärer Ausdruck (kurz regex oder regexp) ist ein leistungsstarkes Werkzeug zur Textverarbeitung. Er verwendet eine spezielle Zeichenkette, um eine Reihe von Zeichenketten zu beschreiben und abzugleichen, die einer bestimmten syntaktischen Regel entsprechen.
Man kann es sich als eineSuper-Wildcardvorstellen. Normale Wildcards (wie zum Beispiel*die für ein beliebiges Zeichen stehen) haben nur begrenzte Funktionalität, während reguläre Ausdrücke extrem komplexe und präzise Textmuster definieren können – vom einfachen Wortabgleich bis zur komplexen Extraktion strukturierter Daten – nahezu alles.
Zum Beispiel verwenden Sie wahrscheinlich?und*Wildcards, um Dateien auf Ihrer Festplatte zu finden.?Die Wildcard stimmt mit 0 oder 1 Zeichen in einem Dateinamen überein, während die*Wildcard mit null oder mehr Zeichen übereinstimmt. Ein Muster wiedata(\w)?\.datfindet die folgenden Dateien:
Die Verwendung des*Zeichens anstelle des?Zeichens erhöht die Anzahl der gefundenen Dateien.data.*\.datEs stimmt mit allen folgenden Dateien überein:
Obwohl diese Suchmethode nützlich ist, ist sie dennoch begrenzt. Wenn man versteht, wie*Platzhalter funktionieren, werden die Konzepte eingeführt, auf denen reguläre Ausdrücke beruhen, aber reguläre Ausdrücke sind leistungsfähiger und flexibler.
Mit regulären Ausdrücken lässt sich leistungsstarke Funktionalität auf einfache Weise erreichen. Hier ist ein einfaches Beispiel:

-
^Entspricht dem Anfang der Eingabezeichenfolge.
-
[0-9]+Entspricht mehreren Ziffern,[0-9]entspricht einer einzelnen Ziffer,+entspricht einer oder mehreren.
-
abc$Entspricht dem Buchstabenabcund endet mitabcam Ende,$entspricht dem Ende der Eingabezeichenfolge.
Wenn man ein Benutzerregistrierungsformular schreibt und nur zulassen möchte, dass BenutzernamenZeichen, Ziffern, Unterstriche und Bindestriche -enthalten, und die Länge des Benutzernamens festlegt, kann man den folgenden regulären Ausdruck verwenden, um ihn zu definieren.
^[a-zA-Z0-9_-]{3,15}$

^Entspricht dem Anfang der Zeichenkette.[a-zA-Z0-9_-]Gibt einen Zeichensatz an, der Kleinbuchstaben, Großbuchstaben, Ziffern, Unterstriche und Bindestriche enthält-。{3,15}Gibt an, dass der vorangehende Zeichensatz mindestens 3-mal und höchstens 15-mal vorkommen muss, wodurch die Länge des Benutzernamens auf zwischen 3 und 15 Zeichen begrenzt wird.$Entspricht dem Ende der Zeichenkette.
Der obige reguläre Ausdruck kann mitexample、example1、run-oob、run_oobübereinstimmen, aber nicht mitru, weil es Buchstaben enthält, die zu kurz sind – weniger als 3 Zeichen –, sodass es nicht übereinstimmen kann. Er stimmt auch nicht mitexample$, weil es Sonderzeichen enthält.
Beispiel
Zeichenfolgen abgleichen, die mit einer Ziffer beginnen und mit "abc" enden.:
Der unten markierte Text ist der Ausdruck, der die Übereinstimmung erzielt hat:
Ausprobieren »
Metazeichen und Funktionen regulärer Ausdrücke
Zeichenabgleich
- Gewöhnliche Zeichen: Gewöhnliche Zeichen werden wörtlich abgeglichen. Zum Beispiel wird beim Abgleich des Buchstabens "a" das Zeichen "a" im Text gefunden.
- Metazeichen: Metazeichen haben spezielle Bedeutungen. Zum Beispiel,
\dstimmt mit jedem Ziffernzeichen überein,\wstimmt mit jedem alphanumerischen Zeichen überein,.stimmt mit jedem Zeichen (außer Zeilenumbruch) überein usw.
Quantifizierer
*: Entspricht dem vorangehenden Muster null oder mehr Male.+: Entspricht dem vorangehenden Muster einmal oder öfter.?: Entspricht dem vorangehenden Muster null oder einmal.{n}: Entspricht dem vorangehenden Muster genau n Mal.{n,}: Entspricht dem vorangehenden Muster mindestens n Mal.{n,m}: Entspricht dem vorangehenden Muster mindestens n Mal und höchstens m Mal.
Zeichenklassen
[ ]: Entspricht einem beliebigen einzelnen Zeichen innerhalb der Klammern. Zum Beispiel,[abc]entspricht den Zeichen "a", "b" oder "c".[^ ]: Entspricht einem beliebigen Zeichen außer denen innerhalb der Klammern. Zum Beispiel,[^abc]entspricht einem beliebigen Zeichen außer "a", "b" oder "c".
Grenzübereinstimmung
^: Entspricht dem Anfang der Zeichenkette.$: Entspricht dem Ende der Zeichenkette.\b: Entspricht einer Wortgrenze.\B: Entspricht einer Nicht-Wortgrenze.
Gruppierung und Erfassung
( ): Wird zum Gruppieren und Erfassen von Teilausdrücken verwendet.(?: ): Wird zum Gruppieren, aber nicht zum Erfassen von Teilausdrücken verwendet.
Sonderzeichen
\: Escape-Zeichen, wird verwendet, um das Sonderzeichen selbst abzugleichen..: Entspricht einem beliebigen Zeichen (außer Zeilenumbruch).|: Wird verwendet, um eine Auswahl unter mehreren Mustern anzugeben.
Definition und Verwendung regulärer Ausdrücke
Technisch gesehen ist ein regulärer Ausdruck eine Zeichenkette, die aus gewöhnlichen Zeichen (wie den Buchstaben a bis z) und Sonderzeichen (Metazeichen genannt) besteht. Diese Zeichenkette bildet einSuchmuster, das zum Suchen, Abgleichen, Ersetzen oder Aufteilen von Text verwendet wird.
Hauptverwendungen
Reguläre Ausdrücke haben drei Hauptverwendungen:
- Textsuche und -abgleich: Schnell feststellen, ob ein Textstück einen Teilstring enthält, der einem bestimmten Muster entspricht. Zum Beispiel prüfen, ob eine Zeichenkette ein gültiges E-Mail-Adressformat ist.
- Textersetzung: Alle Teile des Textes, die einem bestimmten Muster entsprechen, durch neuen Inhalt ersetzen. Zum Beispiel alle Datumsformate in einem Dokument ändern von
YYYY-MM-DDeinheitlich zuMM/DD/YYYY。 - Textextraktion und -aufteilung: Die Teile, die uns interessieren, präzise aus einem großen Textstück extrahieren oder den Text gemäß bestimmten Trennzeichen in ein Array aufteilen. Zum Beispiel alle IP-Adressen aus einer Protokolldatei extrahieren oder eine CSV-Zeichenkette an Kommas aufteilen.
Anwendungsszenarien regulärer Ausdrücke
Reguläre Ausdrücke durchdringen fast jeden Aspekt der Programmierung und der alltäglichen Textverarbeitung. Nachfolgend sind einige der häufigsten Anwendungsszenarien aufgeführt:
1. Datenvalidierung
Dies ist eine der klassischsten Anwendungen regulärer Ausdrücke; sie stellt sicher, dass Benutzereingaben dem erwarteten Format entsprechen.
- Validierung von E-Mail-Adressen: Prüfen, ob die Eingabe wie folgt aussieht
[email protected]。 - Validierung von Telefonnummern: Prüfen, ob sie dem Mobiltelefonnummernformat des Landes/der Region entspricht (z. B. der 11-stelligen Nummer Chinas).
- Validieren der Passwortstärke: Passwörter müssen Groß- und Kleinbuchstaben, Ziffern und Sonderzeichen enthalten.
- Validieren von Datumsformaten: Stellen Sie sicher, dass das Datum in gültigen Formaten wie z. B. vorliegt
2023-12-25oder12/25/2023. - Validieren von Personalausweisnummern: Gleichen Sie Personalausweisnummern ab, die bestimmten Kodierungsregeln entsprechen.
2. Textsuche und Filterung
Informationen in großen Textmengen schnell finden.
- Log-Analyse: Durchsuchen Sie Server-Logs nach allen Einträgen zum
ERRORoderWARNEbene. - Codesuche: Verwenden Sie in einer IDE oder einem Editor reguläre Ausdrücke, um nach allen Funktionsdefinitionen zu suchen (wie z. B.
function xxx(...)) oder nach bestimmten Variablennamen. - Suche im Dokumentinhalt: Finden Sie alle Vorkommen von Telefonnummern oder URLs in einem langen Dokument.
3. Textersetzung und Bereinigung
Textinhalte stapelweise ändern, um sie zu normalisieren.
- Formatieren von Daten: Formatieren Sie Telefonnummern aus
12345678901auf123-4567-8901。 - Datenbereinigung: Zusätzliche Leerraumzeichen aus Text entfernen (wie mehrere aufeinanderfolgende Leerzeichen oder Tabulatoren).
- Maskierung sensibler Informationen: Ausweisnummern im Text ersetzen durch
***, wie zum Beispiel110101199001011234->110101********1234。 - Code-Refactoring: Variablen- oder Funktionsnamen stapelweise umbenennen.
4. Textextraktion und Parsen
Strukturierte Daten aus unstrukturiertem Text extrahieren.
- Webcrawler: Alle Links aus HTML-Code extrahieren (
href="...") oder Bildadresse (src="..."). - Konfigurationsdatei parsen: lesen
key = valueKonfigurationsdatei im Format von. - Spezifische Daten extrahieren: alle Vorkommen von Beträgen aus einem Textstück extrahieren (wie z. B.
¥100.50oder$99.99)。
5. String-Aufteilung
Verwenden Sie komplexe Regeln, nicht nur ein einzelnes Zeichen, um Zeichenfolgen aufzuteilen.
- Zerlegen Sie einen Satz mit einem oder mehreren Leerzeichen, Kommas oder Semikolons.
- Basierend auf verschiedenen Trennzeichen (wie
,、;、\t) zum Parsen von CSV- oder TSV-Daten.
Das folgende Flussdiagramm fasst den Arbeitsablauf regulärer Ausdrücke in der Datenverarbeitung zusammen:

Entwicklungsgeschichte
Die Vorläufer der regulären Ausdrücke lassen sich bis zur frühen Forschung darüber zurückverfolgen, wie das menschliche Nervensystem funktioniert. Warren McCulloch und Walter Pitts, zwei Neurophysiologen, entwickelten eine mathematische Methode zur Beschreibung dieser neuronalen Netzwerke.
Im Jahr 1951 veröffentlichte ein Mathematiker namens Stephen Kleene, aufbauend auf der frühen Arbeit von McCulloch und Pitts, eine Abhandlung mit dem Titel „Representation of Events in Nerve Nets“, in der er das Konzept der regulären Ausdrücke einführte. Reguläre Ausdrücke sind Ausdrücke, mit denen das beschrieben wird, was erdie Algebra der regulären Mengennannte, daher wurde der Begriffregulärer Ausdruckübernommen.
In der Folge stellte sich heraus, dass dies in frühen Forschungsarbeiten mit Ken Thompsons computergestützten Suchalgorithmen angewendet werden konnte. Ken Thompson war einer der Hauptentwickler von Unix. Die erste praktische Anwendung regulärer Ausdrücke war der grep-Editor in Unix.
Die ungefähre Entwicklungsgeschichte sieht wie folgt aus:
1951: Stephen Kleene, einer der Begründer der Berechenbarkeitstheorie und ein amerikanischer Informatiker, schlug erstmals das Konzept der regulären Sprachen vor und verwendete formale Methoden zur Beschreibung dieser Sprache. Dies legte die theoretische Grundlage für die Entwicklung regulärer Ausdrücke.
1960er Jahre: Ken Thompson, einer der Mitbegründer des Unix-Betriebssystems, entwickelte das erste Programm, das reguläre Ausdrücke tatsächlich anwendete und Teil des grep-Befehls in Unix war. Dies markierte den Beginn der praktischen Anwendung regulärer Ausdrücke.
1970er Jahre: Ken Thompson und Rob Pike entwickelten die erste Engine für reguläre Ausdrücke, die in Unix-Systemen weit verbreitet war und eine wichtige Rolle bei der Popularisierung regulärer Ausdrücke spielte.
1986: Philip Hazel entwickelte die PCRE-Bibliothek (Perl Compatible Regular Expressions), eine Bibliothek für reguläre Ausdrücke, die es ermöglicht, reguläre Ausdrücke im Perl-Stil in verschiedenen Programmiersprachen zu verwenden.
1997: IEEE veröffentlichte den POSIX.2-Standard, der die Standardspezifikation für reguläre Ausdrücke enthält und das Verhalten regulärer Ausdrücke über verschiedene Unix-Systeme hinweg konsistenter macht.
Nach den 2000er-Jahren: Reguläre Ausdrücke sind in der Computerprogrammierung und Textverarbeitung immer beliebter geworden. Programmiersprachen und -werkzeuge, die reguläre Ausdrücke unterstützen, sind reichhaltiger und leistungsfähiger geworden, wie Perl, Python, Java, JavaScript usw.
Gegenwärtig: Reguläre Ausdrücke bleiben ein wichtiges Werkzeug für Textverarbeitung und Datenextraktion, mit breiten Anwendungen in Bereichen wie Datenwissenschaft, Textanalyse, Webcrawler, Stringsuche und -ersetzung und mehr.
Anwendungsgebiete
Gegenwärtig werden reguläre Ausdrücke in vielen Softwaresystemen weit verbreitet eingesetzt, darunter *nix (Linux, Unix usw.), HP und andere Betriebssysteme, Entwicklungsumgebungen wie PHP, C#, Java und viele Anwendungsprogramme; Spuren regulärer Ausdrücke sind überall zu sehen.
C# Reguläre Ausdrücke
In unserem C#-Tutorial,Reguläre Ausdrücke in C#ist dieses Kapitel der Einführung in reguläre Ausdrücke in C# gewidmet.
Reguläre Ausdrücke in Java
In unserem Java-Tutorial,Reguläre Ausdrücke in Javaist dieses Kapitel der Einführung in reguläre Ausdrücke in Java gewidmet.
JavaScript Reguläre Ausdrücke
In unserem JavaScript-Tutorial,JavaScript-RegExp-Objektist dieses Kapitel der Einführung in reguläre Ausdrücke in JavaScript gewidmet, und wir bieten außerdem eine vollständigeReferenz zum JavaScript-RegExp-Objekt。
Reguläre Ausdrücke in Python
In unserem Python-Basistutorial,Reguläre Ausdrücke in Pythonist dieses Kapitel der Einführung in reguläre Ausdrücke in Python gewidmet.
Reguläre Ausdrücke in Ruby
In unserem Ruby-Tutorial,Ruby reguläre AusdrückeDieses Kapitel widmet sich der Einführung in Ruby reguläre Ausdrücke.
| Befehl oder Umgebung | . | [ ] | ^ | $ | \( \) | \{ \} | ? | + | | | ( ) |
| vi | √ | √ | √ | √ | √ | |||||
| Visual C++ | √ | √ | √ | √ | √ | |||||
| awk | √ | √ | √ | √ | awk unterstützt diese Syntax; fügen Sie einfach den Parameter --posix oder --re-interval auf der Kommandozeile hinzu. Siehe Intervallausdruck in man awk. | √ | √ | √ | √ | |
| sed | √ | √ | √ | √ | √ | √ | ||||
| delphi | √ | √ | √ | √ | √ | √ | √ | √ | √ | |
| python | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
| java | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
| javascript | √ | √ | √ | √ | √ | √ | √ | √ | √ | |
| php | √ | √ | √ | √ | √ | |||||
| perl | √ | √ | √ | √ | √ | √ | √ | √ | √ | |
| C# | √ | √ | √ | √ | √ | √ | √ | √ |
Im Folgenden wird die Unterstützung regulärer Ausdrücke in gängigen Programmiersprachen verglichen:
| Programmiersprache | Unterstützungsmethode | Gängige Klassen/Module | Einfaches Beispiel (Abgleich von Ziffern) |
|---|---|---|---|
| JavaScript | Unterstützung für die Muttersprache | RegExpObjekt oder unter Verwendung eines Literals/.../ |
/\d+/odernew RegExp("\\d+") |
| Python | StandardbibliothekreModul |
reModul |
re.compile(r"\d+") |
| Java | Standardbibliothekjava.util.regexPaket |
PatternundMatcherKlasse |
Pattern.compile("\\d+") |
| PHP | Integrierte PCRE-Funktionen | preg_Reihe von Funktionen (wie z. B.preg_match) |
preg_match("/\d+/", $text) |
| C# | System.Text.RegularExpressionsnamespace |
RegexKlasse |
new Regex(@"\d+") |
| Go | StandardbibliothekregexpPaket |
regexpPaket |
regexp.MustCompile(\d+) |
| Ruby | Unterstützung für die Muttersprache, Kernklasse | RegexpKlasse |
/\d+/ |