Reguläre Ausdrücke können als Filterkriterien in der Textsuche verwendet werden, indem der Text mit dem Muster des regulären Ausdrucks abgeglichen wird. Dieser Vorgang wird auch Pattern Matching genannt. So ist es beispielsweise möglich, alle Wörter aus einer Wortliste herauszusuchen, die mit S beginnen und auf D enden, ohne die dazwischen liegenden Buchstaben oder deren Anzahl explizit vorgeben zu müssen.
Der Begriff des regulären Ausdrucks geht im Wesentlichen auf den Mathematiker Stephen Kleene zurück, der die ähnliche Bezeichnung reguläre Menge verwendete.[1]
Zu jedem regulären Ausdruck existiert ein endlicher Automat, der die vom Ausdruck spezifizierte Sprache akzeptiert. Ein entsprechender (nichtdeterministischer) endlicher Automat kann mit der Thompson-Konstruktion[3] aus einem regulären Ausdruck konstruiert werden. Daraus folgt die relativ einfache Implementierbarkeit regulärer Ausdrücke. Umgekehrt existiert zu jedem endlichen Automaten ein regulärer Ausdruck, der die vom Automaten akzeptierte Sprache beschreibt. Ein entsprechender regulärer Ausdruck kann mit Kleenes Algorithmus[1][4] aus einem nichtdeterministischen endlichen Automaten konstruiert werden. Kleenes Algorithmus erzeugt meist sehr lange reguläre Ausdrücke. Die Zustands-Elimination[4] (deutsch eigentlich: „Zustands-Eliminierung“) liefert in der Praxis meist kürzere reguläre Ausdrücke. Im schlimmsten Fall (englisch „worst case“) liefern jedoch beide Algorithmen reguläre Ausdrücke der Länge ,[5] wobei die Anzahl der Zeichen des zugrundeliegenden Alphabets und die Anzahl der Zustände im Automaten bezeichnen.
Syntax
Die Syntax definiert genau, wie reguläre Ausdrücke aussehen.
Reguläre Ausdrücke sind immer über einer vorgegebenen endlichen Zeichenmenge definiert, dem sogenannten Alphabet. Reguläre Ausdrücke basieren auf genau drei Operationen: Alternative, Verkettung und Wiederholung. Die formale Definition sieht folgendermaßen aus:
(das spezielle Symbol für die leere Menge) ist ein regulärer Ausdruck.
für alle ist (die Repräsentation eines Zeichens aus dem zugrunde liegenden Alphabet) ein regulärer Ausdruck.
Sind und reguläre Ausdrücke, so sind auch (Alternative), (Verkettung) und (Kleenesche Hülle, Kleene-Stern) reguläre Ausdrücke.
Für Alternative wird statt auch das Symbol verwendet. Man schreibt dann . Für die Verkettung (Konkatenation) gibt es alternativ auch ein Operatorsymbol; man schreibt dann .
Man kann auch zusätzliche Konstanten und Operationen erlauben, sofern sich ihre Wirkung auch mit den oben genannten Grundregeln beschreiben ließe. So findet man in der Literatur unter anderem auch als regulären Ausdruck[4] oder die positive Kleenesche Hülle , die als Abkürzung von betrachtet werden kann.
Gibt man eine Rangfolge der Operatoren an, kann man auf einige Klammern verzichten. Die Rangfolge ist üblicherweise Kleene-Stern vor Konkatenation vor Alternative. Statt genügt dann die Schreibweise .
Die Anzahl der verschachtelten *-Operatoren wird als Sternhöhe bezeichnet.
Semantik
Die Semantik regulärer Ausdrücke definiert genau, welche formale Bedeutung die Syntax regulärer Ausdrücke hat.
Ein regulärer Ausdruck beschreibt eine formale Sprache, also eine Menge von Wörtern (Zeichenketten). Die Definition der Semantik lässt sich analog zur Syntaxdefinition beschreiben. Dabei bezeichnet die formale Sprache, die durch den regulären Ausdruck spezifiziert wird.
Das Symbol für die leere Menge spezifiziert die leere Sprache.
für alle gilt
Jeder Repräsentant eines Zeichens aus dem Alphabet spezifiziert die Sprache, die nur das Wort der Länge eins mit diesem Zeichen enthält.
sind und reguläre Ausdrücke, so gilt:
Die Alternative zwischen zwei Ausdrücken beschreibt die Sprache, die aus der Vereinigung der zwei Sprachen entsteht, die durch die beiden Ausdrücke beschrieben werden.
Die Konkatenation zweier Ausdrücke beschreibt die Sprache, die nur die Wörter enthält, die ein Wort aus der vom ersten Ausdruck beschriebenen Sprache als Präfix haben und deren unmittelbar folgendes Rest-Suffix ein Wort aus der vom zweiten Ausdruck beschriebenen Sprache ist.
Die kleenesche Hülle eines regulären Ausdrucks beschreibt die Sprache mit jenen Wörtern, die durch Aneinanderreihen beliebiger Wörter der durch beschriebenen Sprache entstehen.
Enthält die Syntaxdefinition regulärer Ausdrücke auch die Konstante , so ist deren Bedeutung definiert als , also die Sprache, die nur das leere Wort enthält.
Das leere Wort ist ein Wort einer formalen Sprache () und somit kein regulärer Ausdruck. Die Sprache, die nur das leere Wort enthält, lässt sich aber auch ohne die Konstante durch einen regulären Ausdruck beschreiben, zum Beispiel: . Es wird jedoch nicht immer optisch zwischen einem regulären Ausdruck und der zugehörigen Sprache unterschieden, sodass man statt auch als regulären Ausdruck für die Sprache verwendet, ebenso kann die Unterscheidung zwischen und sowie zwischen und entfallen.
Beispiele
Wenn das Alphabet aus den Buchstaben , und besteht, also , dann lassen sich die folgenden Sprachen mit den entsprechenden regulären Ausdrücken beschreiben:
Die Sprache aller Wörter, die aus beliebig vielen oder aus beliebig vielen bestehen:
Syntax: . Semantik:
Die Sprache aller Wörter, die mit anfangen und mit beliebig vielen oder beliebig vielen enden:
Syntax: . Semantik:
Die Sprache aller Wörter, die mit anfangen und mit einer beliebigen Folge aus den Zeichen enden:
Syntax: . Semantik:
Die Sprache aller Wörter, die zwei Zeichen lang sind und aus den Zeichen und bestehen:
Syntax: . Semantik:
Die Sprache aller Wörter, die aus beliebig vielen Teilwörtern bestehen:
Syntax: . Semantik:
Anwendung regulärer Ausdrücke
Ken Thompson nutzte diese Notation in den 1960er Jahren, um qed (eine Vorgängerversion des Unix-Editors ed) zu bauen und später das Werkzeug grep zu schreiben. Seither implementieren sehr viele Programme und Bibliotheken von Programmiersprachen Funktionen, um reguläre Ausdrücke zum Suchen und Ersetzen von Zeichenketten zu nutzen. Beispiele dafür sind die Programme sed, grep, emacs, die Programmiersprachen Perl und Tcl und Standardbibliotheken der Programmiersprachen C, C++, Java, JavaScript, Python, PHP, Ruby und das .Net-Framework. Auch die Textverarbeitung und die Tabellenkalkulation des Office-Paketes OpenOffice.org bieten die Möglichkeit, mit regulären Ausdrücken im Text zu suchen.
Zwischen verschiedenen Regexp-Implementierungen gibt es Unterschiede in Funktionsumfang und Syntax. In Programmiersprachen haben sich überwiegend die Perl Compatible Regular Expressions (PCRE) durchgesetzt, die sich an der Umsetzung in Perl 5.0 orientieren. Daneben wird bei POSIX.2 zwischen „grundlegenden“ regulären Ausdrücken (basic regular expressions) und „erweiterten“ regulären Ausdrücken (extended regular expressions) unterschieden.
Einige Programme, zum Beispiel der TexteditorVim, bieten die Möglichkeit, zwischen verschiedenen Regexp-Syntaxen hin- und herzuschalten.
Reguläre Ausdrücke spielen eine wichtige Rolle bei der lexikalischen Analyse von Quelltexten, beispielsweise in Compilern oder zur Syntaxhervorhebung in Editoren. Ein lexikalischer Scanner zerlegt den Quelltext mithilfe von regulären Ausdrücken in sogenannte Tokens (Schlüsselwörter, Operatoren, …). Da es sich bei den meisten Programmiersprachen um kontextfreie Sprachen handelt, sind reguläre Ausdrücke nicht mächtig genug, um deren Syntax zu beschreiben. Daher wird die bei Compilern folgende syntaktische Analyse in der Regel von einem separaten Programm, dem Parser, erledigt.
Reguläre Ausdrücke spielen auch in der Bioinformatik eine Rolle. Sie kommen in Proteindatenbanken zum Einsatz, um Proteinmotive zu beschreiben. Der reguläre Ausdruck
beschreibt zum Beispiel eine Proteindomäne in PROSITE. Der obige reguläre Ausdruck besagt Folgendes: Am Anfang wähle die Aminosäure Tryptophan (Einbuchstabencode W), dann wähle 9 bis 11 Aminosäuren frei aus, dann wähle entweder V, F oder Y, dann wähle entweder F, Y oder W, dann wieder 6 bis 7 Aminosäuren frei, dann entweder G, S, T, N oder E, dann entweder G, S, T, Q, C oder R, dann F, Y oder W, dann R dann S dann A dann P.
Reguläre Ausdrücke in der Praxis
Die meisten heutigen Implementierungen unterstützen Erweiterungen wie zum Beispiel Rückwärtsreferenzen (backreferences). Hierbei handelt es sich nicht mehr um reguläre Ausdrücke im Sinne der theoretischen Informatik, denn die so erweiterten Ausdrücke beschreiben nicht mehr notwendigerweise Sprachen vom Typ 3 der Chomsky-Hierarchie.
Die folgenden Syntaxbeschreibungen beziehen sich auf die Syntax der gängigen Implementierungen mit Erweiterungen, sie entsprechen also nur teilweise der obigen Definition aus der theoretischen Informatik.
Eine häufige Anwendung regulärer Ausdrücke besteht darin, spezielle Zeichenketten in einer Menge von Zeichenketten zu finden. Die im Folgenden angegebene Beschreibung ist eine (oft benutzte) Konvention, um Konzepte wie Zeichenklasse, Quantifizierung, Verknüpfung und Zusammenfassen konkret zu realisieren. Hierbei wird ein regulärer Ausdruck aus den Zeichen des zugrunde liegenden Alphabets in Kombination mit den Metazeichen[ ] ( ) { } | ? + - * ^ $ \ . (teilweise kontextabhängig) gebildet, bei manchen Implementierungen auch : ! < =. Die Meta-Eigenschaft eines Zeichens kann durch einen vorangestellten Rückwärtsstrich (Backslash) aufgehoben werden. Alle übrigen Zeichen des Alphabets stehen für sich selbst.
Zeichenliterale
Diejenigen Zeichen, die direkt (wörtlich, literal) übereinstimmen müssen, werden auch direkt notiert. Je nach System gibt es auch Möglichkeiten, das Zeichen durch den Oktal- oder Hexadezimalcode (\ooo bzw. \xhh) oder die hexadezimale Unicode-Position (\uhhhh) anzugeben.
Ein Zeichen aus einer Auswahl
Mit eckigen Klammern ([ und ]) lässt sich eine Zeichenauswahl definieren. Der Ausdruck in eckigen Klammern steht dann für genau ein Zeichen aus dieser Auswahl. Innerhalb dieser Zeichenklassendefinitionen haben einige Symbole andere Bedeutungen als im normalen Kontext. Teilweise ist die Bedeutung eines Symbols vom Kontext abhängig, in dem es innerhalb der Klammern auftritt.
Beispielsweise bedeutet ein Zirkumflex^ am Anfang einer Zeichenklassendefinition, dass die Zeichenklasse negiert bzw. invertiert wird (im Sinne der Komplementbildung). Steht ein Zirkumflex jedoch irgendwo sonst in der Definition, ist es wörtlich („literally“) zu verstehen. Ebenfalls kontextabhängig ist die Bedeutung des Bindestrich-Zeichens (-). Zudem unterscheiden sich hier die Regexp-Auswerter („regex engines“) (zum Beispiel POSIX und PCRE) in einigen Punkten voneinander. Steht ein Bindestrich - zwischen zwei Zeichen in der Klassendefinition, zum Beispiel [a-g], so ist er als Bis-Strich zu verstehen, das heißt als Beschreibung eines Zeichenintervalls oder Zeichenbereichs bezüglich der ASCII-Tabelle. Das genannte Beispiel wäre äquivalent zu [abcdefg]. Am Anfang oder Ende einer Zeichenklasse stehende Bindestriche werden als das Zeichen selbst interpretiert.
Beispiele für Zeichenauswahl
[egh]
eines der Zeichen e, g oder h
[0-6]
eine Ziffer von 0 bis 6 (Bindestriche sind Indikator für einen Bereich)
[A-Za-z0-9]
ein beliebiger lateinischer Buchstabe oder eine beliebige Ziffer
[^a]
ein beliebiges Zeichen außer a (^ am Anfang einer Zeichenklasse negiert selbige)
[-A-Z], [A-Z-] (bzw. [A-Z\-a-z], allerdings nicht gemäß POSIX)[6]
Auswahl enthält auch den Bindestrich -, wenn er das erste oder das letzte Zeichen in der Aufzählung einer Zeichenklasse ist bzw. bei PCRE, wenn seine Metafunktion innerhalb einer Auswahl durch einen vorangestellten Backslash aufgehoben wird
Vordefinierte Zeichenklassen
Es gibt vordefinierte Zeichenklassen, die allerdings nicht von allen Implementierungen in gleicher Weise unterstützt werden, da sie lediglich Kurzformen sind und auch durch eine Zeichenauswahl beschrieben werden können. Wichtige Zeichenklassen sind:
meist zumindest das Leerzeichen und die Klasse der Steuerzeichen\f, \n, \r, \t und \v
\S
no whitespace
ein Zeichen, das kein Whitespace ist, also [^\s]
Ein Punkt (.) bedeutet, dass an seinem Platz ein (fast) beliebiges Zeichen stehen kann. Die meisten RegExp-Implementierungen sehen standardmäßig Zeilenumbrüche nicht als beliebiges Zeichen an, jedoch kann dieses in einigen Programmen mittels des sogenannten Single-Line-Modifiers s (zum Beispiel in /foo.bar/s) erreicht werden.
In vielen neueren Implementierungen können innerhalb der eckigen Klammern nach POSIX auch Klassen angegeben werden, die selbst wiederum eckige Klammern enthalten. Sie lauten beispielsweise:
Beispiele für Zeichenklassen, hierarchisch sortiert
[:cntrl:] – Steuerzeichen. Im ASCII sind das die Zeichen 00 bis 1F und 7F (DEL).
[:print:] – Druckbare Zeichen: [:alnum:], [:punct:] und Leerzeichen
[:xdigit:] – Hexadezimale Ziffern: 0 bis 9, A bis F, a bis f.
[:digit:] – Die Ziffern 0 bis 9
[:alpha:] – Buchstaben: [:lower:] oder [:upper:]
[:lower:] – Kleinbuchstaben ZK2: nicht notwendigerweise nur von a bis z
[:upper:] – Großbuchstaben ZK2: nicht notwendigerweise nur von A bis Z
Anmerkungen:
ZK1
Das auch als „geschütztes Leerzeichen“ bekannte Zeichen mit der Unicode-Nummer 160 (hex: A0) (entspricht dem HTML-Entity ) wird von der Klasse [:space:] möglicherweise nicht gefunden und muss separat anhand des Codepoints identifiziert werden.
ZK2
Was Buchstaben sind, ist in üblichen Betriebssystemen locale-abhängig, also abhängig von der eingestellten Region und Sprache.[7]
Quantoren
Quantoren (englisch quantifier, auch Quantifizierer oder Wiederholungsfaktoren) erlauben es, den vorherigen Ausdruck in verschiedener Vielfachheit in der Zeichenkette zuzulassen.
{min,max}
Der voranstehende Ausdruck muss mindestens min-mal und darf maximal max-mal vorkommen.
{n}
Der voranstehende Ausdruck muss exakt n-mal vorkommen. Dies entspricht {n,n}.
{0,max}
Der voranstehende Ausdruck darf maximal max-mal vorkommen.
{min,}
Der voranstehende Ausdruck muss mindestens min-mal vorkommen.
?
Der voranstehende Ausdruck kommt kein- oder einmal vor, er ist „optional“. Dies entspricht {0,1}.
+
Der voranstehende Ausdruck muss mindestens einmal vorkommen, darf aber auch mehrfach vorkommen. Dies entspricht {1,}.
*
Der voranstehende Ausdruck darf beliebig oft, auch keinmal, vorkommen. Dies entspricht {0,}.
Die Quantoren beziehen sich dabei auf den vorhergehenden regulären Ausdruck, jedoch nicht zwangsläufig auf die durch ihn gefundene Übereinstimmung. So wird zwar zum Beispiel durch a+ ein „a“ oder auch „aaaa“ vertreten, jedoch entspricht [0-9]+ nicht nur sich wiederholenden gleichen Ziffern, sondern auch Folgen gemischter Ziffern, beispielsweise „072345“.
Weitere Beispiele sind:
[ab]+ entspricht „a“, „b“, „aa“, „bbaab“ etc.
[0-9]{2,5} entspricht zwei, drei, vier oder fünf Ziffern in Folge, z. B. „42“ oder „54072“, jedoch nicht den Zeichenfolgen „0“, „1.1“ oder „a1a1“.
Soll eine Zeichenkette nur aus dem gesuchten Muster bestehen (und es nicht nur enthalten), so muss in den meisten Implementierungen explizit definiert werden, dass das Muster vom Anfang (\A oder ^) QF1 bis zum Ende der Zeichenkette (\Z, \z oder $) QF1 reichen soll. Andernfalls erkennt zum Beispiel [0-9]{2,5} auch bei der Zeichenkette „1234507“ die Teilzeichenkette „12345“. Aus dem gleichen Grund ergäbe beispielsweise a* immer einen Treffer, da jede Zeichenfolge insbesondere das leere Wort mindestens 0-mal das Zeichen „a“ enthält.
Quantoren sind standardmäßig „gierig“ (englischgreedy) implementiert. Das heißt, ein regulärer Ausdruck wird zur größtmöglichen Übereinstimmung aufgelöst. Da dieses Verhalten jedoch nicht immer so gewollt ist, lassen sich bei vielen neueren Implementierungen Quantoren als „genügsam“ oder „zurückhaltend“ (englisch non-greedy, reluctant) deklarieren. Zum Beispiel wird in Perl oder tcl hierfür dem Quantor ein Fragezeichen ? nachgestellt. Die Implementierung von genügsamen Quantoren ist vergleichsweise aufwendig und während des Suchvorgangs langsam (erfordert Backtracking), weshalb manche Implementierungen diese ausdrücklich vermeiden z. B. sed.
Beispiel (Perl-Syntax)
Angenommen, es wird der reguläre Ausdruck A.*B auf die Zeichenfolge „ABCDEB“ angewendet, so würde er sie als „ABCDEB“ finden. Mit Hilfe des „genügsamen“ Quantors *? passt der nun modifizierte Ausdruck – also A.*?B – nur die Zeichenkette „AB“, bricht also die Suche nach dem ersten gefundenen „B“ ab. Ein gleichwertiger regulärer Ausdruck für Interpreter, die diesen Quantor nicht unterstützen, wäre A[^B]*B.
QF1
Die Zeichen ^ und $ passen im multiline-Modus zusammen, also wenn der m-Modifier gesetzt wird, auch Zeilenanfänge und -enden.
Possessives Verhalten
Eine Variante des oben beschriebenen gierigen Verhaltens ist das possessive matching. Da hierbei jedoch das Backtracking verhindert wird, werden einmal übereinstimmende Zeichen nicht wieder freigegeben. Daher finden sich in der Literatur auch die synonymen Bezeichnungen atomic grouping, independent subexpression oder non-backtracking subpattern. Die Syntax für diese Konstrukte variiert bei den verschiedenen Programmiersprachen. Ursprünglich wurden solche Teilausdrücke (englisch „subpattern“) in Perl durch (?>Ausdruck) formuliert. Daneben existieren seit Perl 5.10 die äquivalenten, in Java bereits üblichen possessiven Quantoren ++, *+, ?+ und {min,max}+.
Beispiel
Angenommen es wird auf die Zeichenfolge „ABCDEB“ der reguläre Ausdruck A.*+B angewendet, so fände er keine Übereinstimmung. Bei der Abarbeitung des regulären Ausdrucks würde der Teil .*+ bis zum Ende der Zeichenkette übereinstimmen. Um jedoch den gesamten Ausdruck zu finden, müsste ein Zeichen – hier also das „B“ – wieder freigegeben werden. Der possessive Quantor verbietet dies aufgrund des unterdrückten Backtrackings, weshalb keine erfolgreiche Übereinstimmung gefunden werden kann.
Gruppierungen und Rückwärtsreferenzen
Ausdrücke lassen sich mit runden Klammern ( und )zusammenfassen:
Etwa erlaubt (abc)+ ein „abc“ oder ein „abcabc“ etc. Wörtlich gemeinte Klammern kann man
mit \( und \) benennen. Bei manchen Implementationen ist es umgekehrt; in jedem Fall sind aber runde Klammern innerhalb von Zeichenklassen immer wörtlich.
Einige Implementierungen speichern die gefundenen Übereinstimmungen von Gruppierungen ab und ermöglichen deren Wiederverwendung im regulären Ausdruck oder bei der Textersetzung. Diese werden Rückwärtsreferenzen (englisch back references) genannt. Häufig wird dazu die Schreibweise \n oder $n verwendet, wobei n die Übereinstimmung der n-ten Gruppierung entspricht. Eine Sonderstellung stellt dabei n=0 dar, das meist für die Übereinstimmung des gesamten regulären Ausdrucks steht.
Beispiel
Ein Suchen und Ersetzen mit AA(.*?)BB als regulärem Suchausdruck und \1 als Ersetzung ersetzt alle Zeichenketten, die von AA und BB eingeschlossen sind, durch den zwischen AA und BB enthaltenen Text. Das heißt AA und BB und der Text dazwischen werden ersetzt durch den Text, der ursprünglich zwischen AA und BB stand, also fehlen AA und BB im Ergebnis.
Interpreter von regulären Ausdrücken, die Rückwärtsreferenzen im Suchmuster zulassen, entsprechen nicht mehr dem Typ 3 der Chomsky-Hierarchie. Mit dem Pumping-Lemma lässt sich zeigen, dass ein regulärer Ausdruck, der feststellt, ob in einer Zeichenkette vor und nach der 1 die gleiche Anzahl von 0 steht, keine reguläre Sprache ist.
Daneben gibt es auch noch Gruppierungen, die keine Rückwärtsreferenz erzeugen (englisch non-capturing). Die Syntax dafür lautet in den meisten Implementierungen (?:…). Regexp-Dokumentationen weisen darauf hin, dass die Erzeugung von Rückwärtsreferenzen stets vermieden werden soll, wenn kein späterer Zugriff auf sie erfolge. Denn die Erzeugung der Referenzen kostet Ausführungszeit und belegt Platz zur Speicherung der gefundenen Übereinstimmung. Zudem lassen die Implementationen nur eine begrenzte Anzahl an Rückwärtsreferenzen zu (häufig nur maximal 9).
Beispiel
Mit dem regulären Ausdruck \d+(?:-\d+)* können Folgen von durch Bindestriche getrennten Zahlenfolgen gefunden werden, ohne dabei die letzte durch einen Bindestrich getrennte Zahlenfolge als Rückreferenz zu erhalten.
Beispiel
Ein Datum im Format MM/DD/YYYY soll in das Format YYYY-MM-DD überführt werden.
Mit Hilfe des Ausdrucks ([0-1]?[0-9])\/([0-3]?[0-9])\/([0-9]{4}) werden die drei Zahlengruppen extrahiert.
Mit dem Ersetzungs-Ausdruck \3-\1-\2 werden die einzelnen Gruppen in das richtige Format überführt.
Alternativen
Man kann alternative Ausdrücke mit dem |-Symbol zulassen.
Beispiel
ABC|abc bedeutet „ABC“ oder „abc“, aber z. B. nicht „Abc“.
Weitere Zeichen
Um die oft auf Zeichenketten bezogenen Anwendungen auf dem Computer zu unterstützen, werden in der Regel zusätzlich zu den bereits genannten die folgenden Zeichen definiert:
^
steht für den Zeilenanfang (nicht zu verwechseln mit ^ bei der Zeichenauswahl mittels [ und ]).
$
kann je nach Kontext für das Zeilen- oder Zeichenketten-Ende stehen, wobei bei manchen Implementierungen noch ein „\n“ folgen darf. Das tatsächliche Ende passt zu \z.
\
hebt gegebenenfalls die Metabedeutung des nächsten Zeichens auf (siehe Maskierungszeichen). Beispielsweise lässt der Ausdruck (A\*)+ die Zeichenketten „A*“, „A*A*“ usw. zu. Auf diese Weise lässt sich auch ein Punkt „.“ mit \. suchen, während nach \ mit \\ gesucht wird.
\b
leere Zeichenkette am Wortanfang oder am Wortende
\B
leere Zeichenkette, die nicht den Anfang oder das Ende eines Wortes bildet
[^ ]$ bedeutet: Die Zeichenkette muss aus mindestens einem Zeichen bestehen, und das letzte Zeichen darf kein Leerzeichen sein.
Look-around assertions
Perl Version 5 führte zusätzlich zu den üblichen regulären Ausdrücken auch look-ahead und look-behind assertions (etwa „vorausschauende“ bzw. „nach hinten schauende“ Annahmen oder Behauptungen) ein, was unter dem Begriff look-around assertions zusammengefasst wird.[8] Diese Konstrukte erweitern die regulären Ausdrücke um die Möglichkeit, kontextabhängige (englisch: „context sensitive“) Bedingungen zu formulieren, ohne den Kontext selbst als passend zu finden. Das heißt, möchte man alle Zeichenfolgen „Sport“ finden, denen die Zeichenfolge „verein“ folgt, ohne dass jedoch die gefundene Zeichenfolge die Zeichenfolge „verein“ selbst enthält, wäre dies mit einer look-ahead assertion möglich: Sport(?=verein). Im Beispielsatz „Ein Sportler betreibt Sport im Sportverein.“ würde jener reguläre Ausdruck also zum letzten Vorkommen von „Sport“ passen, da nur diesem die Zeichenfolge „verein“ folgt; er würde jedoch nicht zur Teilzeichenkette „Sportverein“ passen.
Aufgrund der Eigenschaft, dass der angegebene Kontext (im Beispiel „verein“) zwar angegeben wird, jedoch kein expliziter Bestandteil der passenden Zeichenkette (hier „Sport“) ist, wird im Zusammenhang mit assertions meist das Attribut zero-width mitgenannt. Die vollständigen Bezeichnungen lauten somit – je nachdem, ob ein bestimmter Kontext gefordert (positiv) oder verboten (negativ) ist – zero-width positive/negative look-ahead/behind assertions. Die Bezeichnungen der Richtungen rühren daher, dass Regexp-Parser eine Zeichenkette immer von links nach rechts abarbeiten.
Definition
Bezeichnung
Erklärung
Schreibweise
(?=Ausdruck)
positive look-ahead assertion
Ausdruck muss auf vorgenannten Ausdruck folgen
Ausdruck(?=Ausdruck)
(?!Ausdruck)
negative look-ahead assertion
Ausdruck darf nicht auf vorgenannten Ausdruck folgen
Ausdruck(?!Ausdruck)
(?<=Ausdruck)
positive look-behind assertion
Ausdruck muss nachfolgendem Ausdruck vorausgehen
(?<=Ausdruck)Ausdruck
(?<!Ausdruck)
negative look-behind assertion
Ausdruck darf nachfolgendem Ausdruck nicht vorausgehen
(?<!Ausdruck)Ausdruck
Look-arounds werden nicht nur von Perl und PCRE, sondern unter anderem auch von Java, .NET und Python unterstützt. JavaScript interpretiert ab Version 1.5 positive und negative Look-Aheads.[9]
Beispiel
\s(?=EUR) steht für ein „Whitespace“-Zeichen (d. h. Leerzeichen oder Tabulator), dem die Zeichenkette EUR folgt. Im Gegensatz zu \sEUR gehört hier EUR nicht zu einer passenden Zeichenkette (englisch: „matched character string“).
Inline modifiers
Einige Implementierungen (unter anderem PHP, Perl/PCRE, Python sowie die PowerShell-Operatoren -match und -replace) unterstützen eingebettete Modifikatoren:
(?Modifikatoren)Ausdruck
Modifikatoren mit unbeschränktem Geltungsbereich.
(?Modifikatoren:Ausdruck)
Modifikatoren mit auf den Ausdruck eingeschränktem Geltungsbereich.
Es können mehrere Modifikatoren hintereinander geschrieben werden, wobei voranstehende Minuszeichen (-) deren Wirkungen negieren. Verbreitete Modifikatoren sind:
i
für Case-Insensitive, d. h. zwischen Groß- und Kleinschreibung wird nicht unterschieden.
m
aktiviert multiline-Modus, d. h. ^ und $ treffen nicht nur auf den Anfang bzw. das Ende der Eingabe zu, sondern auch auf darin enthaltene Zeilenumbrüche.
s
aktiviert singleline-Modus, d. h. ein Punkt (.) führt auch für Zeilenumbrüche zu einem Treffer.
Beispiele:
(?i)i als auch (?i:i) finden jeweils in Iris zwei Treffer.
(?-i)i als auch (?-i:i) finden jeweils in Iris nur einen Treffer.
Bedingte Ausdrücke
Relativ wenig verbreitet sind bedingte Ausdrücke. Diese sind unter anderem in Perl, PCRE und dem .Net-Framework einsetzbar. Python bietet für solche Ausdrücke im Zusammenhang mit Look-around assertions nur eingeschränkte Funktionalität.[10]
(?(Bedingung)wahr-Ausdruck|falsch-Ausdruck)
Wenn die Bedingung zutrifft, kommt der wahr-Ausdruck zur Anwendung, andernfalls der falsch-Ausdruck.
Ist der falsch-Ausdruck leer, so kann der senkrechte Strich (|) entfallen. Als Bedingung kann u. a. eine Look-around assertion oder die Nummer einer Gruppierung angegeben werden, die zutreffen muss, damit der wahr-Ausdruck Anwendung findet.
Beispiel
Mit den Ausdrücken (\()?\d+(?(1)\)) und (?(?=\()\(\d+\)|\d+) werden jeweils Zeichenfolgen wie 1, (2), 34 oder (567) getroffen, aber nicht (42 oder 3). Es soll nicht unerwähnt bleiben, dass sich mittels der einfachen Alternative\(\d+\)|\d+ das gleiche Ergebnis erzielen lässt.
Beispiele
Die folgende Tabelle zeigt einige reguläre Ausdrücke und jeweils dazu passende Zeichenketten:[11]
Kenneth R. Beesley, Lauri Karttunen: Finite-State Morphology. Distributed for the Center for the Study of Language and Information. 2003. 2003 Series: (CSLI-SCL) Studies in Computational Linguistics.
Reguläre Ausdrücke und Automatentheorie
Jan Lunze: Ereignisdiskrete Systeme. Oldenbourg, 2006, ISBN 3-486-58071-X, S. 160–192.
Forschungsliteratur
Stephen C. Kleene: Representation of Events in Nerve Nets and Finite Automata. In: Claude E. Shannon, John McCarthy (Hrsg.): Automata Studies. Princeton University Press, 1956, S. 3–42.
Castelnuovo di ConzaKomuneComune di Castelnuovo di ConzaLokasi Castelnuovo di Conza di Provinsi SalernoNegara ItaliaWilayah CampaniaProvinsiSalerno (SA)Luas[1] • Total14,06 km2 (5,43 sq mi)Ketinggian[2]650 m (2,130 ft)Populasi (2016)[3] • Total641 • Kepadatan46/km2 (120/sq mi)Zona waktuUTC+1 (CET) • Musim panas (DST)UTC+2 (CEST)Kode pos84020Kode area telepon0828Situs webhttp://www.c...
Водный СтражWatcher in the Water Варианты имени Глубинный Страж Раса Неизвестна, древнее существо из глубин Пол Неизвестен Место обитания Сираннон Водный Страж (англ. Watcher in the Water, вариант перевода — Глубинный Страж) — вымышленное существо из легендариума Дж. Р. Р. То...
Fowlpox virus Ayam yang menderita cacar unggas karena terinfeksi Fowlpox virusKomposisi genom virus ICTVVirus ADN untai ganda, Virus ADN untai ganda dan Virus ADN untai ganda PenyakitCacar unggas TaksonomiSuperdomainBiotaDomainVirusDuniaVaridnaviriaKerajaanBamfordviraeFilumNucleocytoviricotaKelasPokkesviricetesOrdoChitoviralesFamiliPoxviridaeSubfamiliChordopoxvirinaeGenusAvipoxvirusSpesiesFowlpox virus lbs Fowlpox virus (disingkat FPV) adalah spesies virus yang berada dalam genus Avipoxvirus ...
العلاقات السنغافورية الفانواتية سنغافورة فانواتو سنغافورة فانواتو تعديل مصدري - تعديل العلاقات السنغافورية الفانواتية هي العلاقات الثنائية التي تجمع بين سنغافورة وفانواتو.[1][2][3][4][5] مقارنة بين البلدين هذه مقارنة عامة ومرجعية للدول�...
Untuk Menteri Kesehatan Indonesia periode 1993–1998, lihat Sujudi. Achmad Sujudi Menteri Kesehatan Indonesia ke-14Masa jabatan29 Oktober 1999 – 23 Juli 2001PresidenAbdurrahman Wahid PendahuluFarid Anfasa MoeloekPenggantiPetahanaMasa jabatan10 Agustus 2001 – 20 Oktober 2004PresidenMegawati Soekarnoputri PenggantiSiti Fadilah SupariDirektur Jenderal Pemberantasan Penyakit Menular dan Penyehatan Lingkungan PemukimanMasa jabatan26 Juni 1998 – 26 Oktober 1999...
AchzivStruktur yang tersisa dari az-Zeeb (sekarang wilayah rekreasi), yang meliputi masjid, 2009Lokasi di Israel Barat LautTampilkan peta Israel Barat LautAchziv (Israel)Tampilkan peta IsraelNama alternatifAz-Zeeb (الزيب) al-Zib, al-Zaib [1]LokasiAkhzivland, IsraelWilayahDistrik UtaraKoordinat33°02′57″N 35°06′08″E / 33.04917°N 35.10222°E / 33.04917; 35.10222Koordinat: 33°02′57″N 35°06′08″E / 33.04917°N 35.10222°...
English writer, television presenter, and producer Not to be confused with Charlie Brooks. Charlie BrookerBrooker in 2011BornCharlton Brooker (1971-03-03) 3 March 1971 (age 53)Reading, EnglandEducationUniversity of WestminsterOccupation(s)Presenter, author, screenwriter, cartoonist, producer, social criticYears active1987–presentSpouse Konnie Huq (m. 2010)Children2 Charlton Brooker (born 3 March 1971) is an English writer, television presenter, produ...
Questa voce sull'argomento contee dell'Illinois è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Contea di ClarkconteaLocalizzazioneStato Stati Uniti Stato federato Illinois AmministrazioneCapoluogoMarshall Data di istituzione1819 TerritorioCoordinatedel capoluogo39°23′34″N 87°41′37″W / 39.392778°N 87.693611°W39.392778; -87.693611 (Contea di Clark)Coordinate: 39°23′34″N 87°41′37″W / 39.3...
Philippine multinational food processing company Nutri-Asia, Inc.The JY Campos Centre in Bonifacio Global City, the headquarters of NutriAsia.Trade nameNutriAsiaFormerlyEnriton Natural Foods, Inc. (1990–96)Company typePrivateIndustryFood processingPredecessors Southeast Asia Food, Inc. (1991–2010) Heinz-UFC Philippines, Inc. (2001–06) UFC Philippines, Inc. (2006–10) FoundedOctober 1, 1990; 33 years ago (1990-10-01)FounderJoselito D. Campos Jr.HeadquartersJY Campos Ce...
Patroli Bimbinganگشت ارشادLogo resmiInformasi lembagaDibentukMusim panas 2005[a]Dibubarkan Dibubarkan pada 3 Desember 2022[1] Diaktifkan kembali pada 16 Juli 2023.[2] Lembaga penggantiKomite Revolusi IslamJenisWakil regu/Polisi syariah menegakkan aturan berpakaian Islam di depan umum dengan menangkap orang-orang yang melanggar aturan, biasanya berkaitan dengan hijab.Departemen indukKomando Penegakan Hukum Republik Islam Iran Seorang polisi agama menegur seorang...
سفارة روسيا في الهند روسيا الهند الإحداثيات 28°34′58″N 77°11′01″E / 28.582809°N 77.183586°E / 28.582809; 77.183586 البلد الهند المكان نيودلهي الاختصاص الهند الموقع الالكتروني الموقع الرسمي تعديل مصدري - تعديل سفارة روسيا في الهند هي أرفع تمثيل دبلوماسي[1] لدولة روسيا ل�...
Untuk pemain kriket, lihat John Dearden (pemain kriket). John DeardenKardinal, Uskup Agung Emeritus DetroitTakhtaDetroitAwal masa jabatan18 Desember 1958Masa jabatan berakhir15 Juli 1980PendahuluEdward MooneyPenerusEdmund SzokaJabatan lainKardinal-Imam S. Pio X alla BalduinaImamatTahbisan imam8 Desember 1932oleh Francesco Marchetti SelvaggianiTahbisan uskup18 Mei 1948oleh Amleto Giovanni CicognaniPelantikan kardinal28 April 1969oleh Paulus VIInformasi pribadiLahir(1907-10-15)15 Okto...
Questa voce o sezione sugli argomenti allenatori di calcio serbi e calciatori serbi non cita le fonti necessarie o quelle presenti sono insufficienti. Puoi migliorare questa voce aggiungendo citazioni da fonti attendibili secondo le linee guida sull'uso delle fonti. Segui i suggerimenti del progetto di riferimento. Questa voce sugli argomenti allenatori di calcio serbi e calciatori serbi è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i sug...
India-related events during the year of 1920 ← 1919 1918 1917 1920 in India → 1921 1922 1923 Centuries: 18th 19th 20th 21st Decades: 1900s 1910s 1920s 1930s 1940s See also:List of years in IndiaTimeline of Indian history Events in the year 1920 in India. Incumbents Emperor of India – George V Viceroy of India – Frederic Thesiger, 1st Viscount Chelmsford Events National income – ₹ 30,428 million 1 September – Non-cooperation movement was launched by Mahatma Gandhi. 8 Sept...
У этого термина существуют и другие значения, см. Автозаводская линия. Автозаводская линиябелор. Аўтазаводская лініяМинский метрополитен Открытие первого участка 31 декабря 1990 Длина, км 18,1[1] Количество станций 14 Время поездки, минут 27 Число вагонов в составе поезд...
1912 Progressive National Convention1912 presidential election Nominees Roosevelt and JohnsonConventionDate(s)August 5, 1912CityChicago, IllinoisVenueChicago ColiseumCandidatesPresidential nomineeTheodore Roosevelt of New YorkVice presidential nomineeHiram Johnson of CaliforniaOther candidatesnoneVotingTotal delegates2000+Votes needed for nomination?Results (president)Theodore Roosevelt (NY): 2000+ (100%)Ballots11916 › Progressive convention, 1912 Roosevelt delivering a speech at the c...
هذه المقالة بحاجة لصندوق معلومات. فضلًا ساعد في تحسين هذه المقالة بإضافة صندوق معلومات مخصص إليها. يعود تاريخ الفن المغربي إلى الحقبة ما قبل التاريخ عبر النقوش الصخرية.[1] حواف من الكتان الطبيعي مطرزة بالحرير الأحمر بتصميم هندسي من خيطين متشابكين، القرن 19 عينة تطريز من ...
Ezra 2Kitab Ezra (Kitab Ezra-Nehemia) (memuat Kitab Ezra dan Nehemia) lengkap pada Kodeks Leningrad, dibuat tahun 1008.KitabKitab EzraKategoriNevi'imBagian Alkitab KristenPerjanjian LamaUrutan dalamKitab Kristen15← pasal 1 pasal 3 → Ezra 2 (disingkat Ezr 2) adalah bagian dari Kitab Ezra dalam Alkitab Ibrani dan Perjanjian Lama di Alkitab Kristen. Memuat riwayat orang-orang yang pulang dari pembuangan ke Babel menurut catatan Ezra. Dalam Alkitab Ibrani termasuk dalam bagian Ketuvim...
Japan House of Representatives constituency Iwate 1st DistrictParliamentary constituencyfor the Japanese House of RepresentativesNumbered map of Iwate Prefecture single-member districtsPrefectureIwateProportional DistrictTohokuElectorate278,860Current constituencyCreated1994SeatsOnePartyCDPRepresentativeTakeshi Shina (2007–)Created fromIwate's 1st medium-sized districtMunicipalitiesThe city of Morioka, town of Shiwa and town of Yahaba Iwate 1st district (岩手[県第]1区, Iwate[-ken dai-]...