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:

Beispiel

data.dat
data1.dat
data2.dat
datax.dat
dataN.dat

Ausprobieren »

Die Verwendung des*Zeichens anstelle des?Zeichens erhöht die Anzahl der gefundenen Dateien.data.*\.datEs stimmt mit allen folgenden Dateien überein:

Beispiel

data.dat
data1.dat
data2.dat
data12.dat
datax.dat
dataXYZ.dat

Ausprobieren »

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


Ausprobieren »

Beispiel

Zeichenfolgen abgleichen, die mit einer Ziffer beginnen und mit "abc" enden.:

var str = "123abc"; var patt1 = /^[0-9]+abc$/; document.write(str.match(patt1));

Der unten markierte Text ist der Ausdruck, der die Übereinstimmung erzielt hat:

123abc

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:

  1. 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.
  2. Textersetzung: Alle Teile des Textes, die einem bestimmten Muster entsprechen, durch neuen Inhalt ersetzen. Zum Beispiel alle Datumsformate in einem Dokument ändern vonYYYY-MM-DDeinheitlich zuMM/DD/YYYY。
  3. 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. vorliegt2023-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 zumERRORoderWARNEbene.
  • 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 aus12345678901auf123-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: lesenkey = 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+/
Weitere Erweiterungen