Regular ExpressionsErste Schritte mit regulären Ausdrücken


Bemerkungen

Für viele Programmierer ist der Regex eine Art magisches Schwert, das sie werfen, um jede Art von Textanalyse zu lösen. Aber dieses Tool ist nichts Magisches, und obwohl es großartig ist bei dem, was es tut, ist es keine vollständige Programmiersprache ( dh es ist nicht Turing-vollständig).

Was bedeutet "regulärer Ausdruck"?

Reguläre Ausdrücke drücken eine durch eine reguläre Grammatik definierte Sprache aus, die von einem nichtdeterministischen endlichen Automaten (NFA) gelöst werden kann, wobei die Übereinstimmung durch die Zustände dargestellt wird.

Eine reguläre Grammatik ist die einfachste Grammatik, wie sie von der Chomsky-Hierarchie ausgedrückt wird.

Chomskys Hierarchie

Einfach gesagt, eine reguläre Sprache wird visuell durch das ausgedrückt, was eine NFA ausdrücken kann, und hier ist ein sehr einfaches Beispiel für NFA:

NFA-Beispiel

Und die Sprache für reguläre Ausdrücke ist eine Textdarstellung eines solchen Automaten. Das letzte Beispiel wird durch die folgende Regex ausgedrückt:

^[01]*1$

Welches ist eine Zeichenfolge, die mit 0 oder 1 beginnt und 0 oder mehrmals wiederholt wird, die mit einer 1 endet. Mit anderen Worten, es ist ein Regex, um ungerade Zahlen aus ihrer binären Darstellung abzugleichen.

Sind alle Regex tatsächlich eine reguläre Grammatik?

Eigentlich nicht. Viele Regex-Engines haben sich verbessert und verwenden Push-Down-Automaten , die sich während des Betriebs stapeln lassen und Informationen abrufen können. Diese Automaten definieren, was in Chomskys Hierarchie kontextfreie Grammatiken genannt wird . Die häufigste Verwendung von nicht regulären Regex ist die Verwendung eines rekursiven Musters für das Übereinstimmen von Klammern.

Ein rekursiver Regex wie der folgende (der in Klammern steht) ist ein Beispiel für eine solche Implementierung:

{((?>[^\(\)]+|(?R))*)}

(Dieses Beispiel funktioniert nicht mit der re Engine von Python, sondern mit der regex Engine oder mit der PCRE-Engine ).

Ressourcen

Weitere Informationen zur Theorie der regulären Ausdrücke finden Sie in den folgenden vom MIT zur Verfügung gestellten Kursen:

Wenn Sie einen komplexen Regex schreiben oder debuggen, gibt es Online-Tools, mit denen Sie Regex als Automaten visualisieren können, wie zum Beispiel die Debuggex-Site .

Versionen

PCRE

Ausführung Veröffentlicht
2 2015-01-05
1 1997-06-01

Wird von PHP 4.2.0 (und höher), Delphi XE (und höher), Julia , Notepad ++ verwendet

Perl

Ausführung Veröffentlicht
1 1987-12-18
2 1988-06-05
3 1989-10-18
4 1991-03-21
5 1994-10-17
6 2009-07-28

.NETZ

Ausführung Veröffentlicht
1 2002-02-13
4 2010-04-12

Sprachen: C #

Java

Ausführung Veröffentlicht
4 2002-02-06
5 2004-10-04
7 2011-07-07
SE8 2014-03-18

JavaScript

Ausführung Veröffentlicht
1.2 1997-06-11
1.8.5 2010-07-27

Python

Ausführung Veröffentlicht
1.4 1996-10-25
2,0 2000-10-16
3,0 2008-12-03
3.5.2 2016-06-07

Oniguruma

Ausführung Veröffentlicht
Initiale 2002-02-25
5.9.6 2014-12-12
Onigmo 2015-01-20

Boost

Ausführung Veröffentlicht
0 1999-12-14
1.61.0 2016-05-13

POSIX

Ausführung Veröffentlicht
BRE 1997-01-01
EHE 2008-01-01

Sprachen: Bash

Character Guide

Beachten Sie, dass sich einige Syntaxelemente je nach Ausdruck unterschiedlich verhalten.

Syntax Beschreibung
? Stimmt mit dem vorhergehenden Zeichen oder Unterausdruck 0 oder 1 überein. Wird auch für nicht erfassende Gruppen und benannte Erfassungsgruppen verwendet.
* Stimmt mit dem vorhergehenden Zeichen oder Unterausdruck mindestens 0 mal überein.
+ Ordnen Sie den vorhergehenden Buchstaben oder Unterausdruck mindestens ein Mal zu.
{n} Passen Sie das vorhergehende Zeichen oder den Unterausdruck genau n- mal an.
{min,} Entspricht die vorhergehenden Zeichen oder subexpression min oder mehr Male.
{,max} Entspricht dem vorhergehenden Zeichen oder Unterausdruck maximal oder weniger.
{min,max} Mindestens min- mal, maximal jedoch max .
- Wenn es in eckigen Klammern steht to ; Beispiel: [3-6] stimmt mit den Zeichen 3, 4, 5 oder 6 überein.
^ Anfang der Zeichenfolge (oder Zeilenanfang, wenn die Option multiline /m angegeben ist) oder negiert eine Liste von Optionen (z. B. in eckigen Klammern [] )
$ Ende der Zeichenfolge (oder Ende einer Zeile, wenn die Option multiline /m angegeben ist).
( ... ) Gruppiert Unterausdrücke und erfasst übereinstimmenden Inhalt in speziellen Variablen ( \1 , \2 usw.), die später innerhalb desselben regulären Ausdrucks verwendet werden können. Beispielsweise stimmt (\w+)\s\1\s mit der Wortwiederholung überein
(?<name> ... ) Gruppiert Unterausdrücke und erfasst sie in einer benannten Gruppe
(?: ... ) Gruppiert Unterausdrücke ohne Erfassung
. Stimmt mit jedem Zeichen außer Zeilenumbrüchen ( \n und normalerweise \r ) \r .
[ ... ] Jedes Zeichen zwischen diesen Klammern sollte einmal übereinstimmen. NB: ^ Nach der offenen Klammer wird dieser Effekt aufgehoben. - Wenn Sie in den Klammern vorkommen, können Sie einen Wertebereich angeben (es sei denn, es handelt sich um das erste oder letzte Zeichen, in diesem Fall handelt es sich lediglich um einen regulären Bindestrich).
\ Escape das folgende Zeichen. Wird auch in Meta-Sequenzen verwendet - Regex-Token mit besonderer Bedeutung.
\$ Dollar (dh ein entkommenes Sonderzeichen)
\( offene Klammer (dh ein Escape-Sonderzeichen)
\) schließende Klammer (dh ein Escape-Sonderzeichen)
\* Sternchen (dh ein Escape-Sonderzeichen)
\. Punkt (dh ein Escape-Sonderzeichen)
\? Fragezeichen (dh ein Escape-Sonderzeichen)
\[ linke (offene) eckige Klammer (dh ein nicht zugeordnetes Sonderzeichen)
\\ Backslash (dh ein Escape-Sonderzeichen)
\] rechtes (enges) eckiges Klammerzeichen (dh ein hinterlegtes Sonderzeichen)
\^ Caret (dh ein entfliehenes Sonderzeichen)
\{ linke (offene) geschweifte Klammer / Klammer
\| Pipe (dh ein entgangenes Sonderzeichen)
\} rechtes (enges) geschweiftes Bracket / Brace (dh ein entgangenes Sonderzeichen)
\+ Plus (dh ein Escape-Sonderzeichen)
\A Anfang einer Zeichenfolge
\Z Ende einer Zeichenfolge
\z absolut von einer schnur
\b Wort (alphanumerische Reihenfolge)
\1 , \2 usw. Rückverweise auf zuvor übereinstimmende Unterausdrücke, gruppiert nach () , \1 bedeutet die erste Übereinstimmung, \2 bedeutet zweite Übereinstimmung usw.
[\b] Rücktaste - Wenn sich \b innerhalb einer Zeichenklasse ( [] ) befindet, entspricht die Rücktaste
\B negated \b - passt an jeder Position zwischen Zwei-Wort-Zeichen sowie an einer beliebigen Position zwischen zwei Nicht-Wort-Zeichen
\D Nicht-Ziffer
\d Ziffer
\e Flucht
\f Formularvorschub
\n Zeilenvorschub
\r Wagenrücklauf
\S Nicht-Weißraum
\s Leerraum
\t Tab
\v vertikale Registerkarte
\W Nicht-Wort
\w Wort (dh alphanumerisches Zeichen)
{ ... } benannter Zeichensatz
| oder; dh umreißt die vorherigen und vorhergehenden Optionen.