„Regulärer Ausdruck“ – Versionsunterschied
[gesichtete Version] | [gesichtete Version] |
Inhalt gelöscht Inhalt hinzugefügt
TapTun (Diskussion | Beiträge) |
|||
(23 dazwischenliegende Versionen von 16 Benutzern werden nicht angezeigt) | |||
Zeile 9:
Reguläre Ausdrücke sind spezielle Formeln, die [[Reguläre Sprache|reguläre Sprachen]] beschreiben können.<ref>{{Literatur |Autor=Uwe Schöning |Titel=Theoretische Informatik - kurz gefasst |Auflage=5. |Verlag=Spektrum Akademischer Verlag |Ort=Heidelberg |Datum=2009 |ISBN=978-3-8274-1824-1 |Seiten=28}}</ref> Diese regulären Sprachen befinden sich auf der untersten Stufe der [[Chomsky-Hierarchie]] (Typ-3). Sie werden durch [[reguläre Grammatik]]en erzeugt.
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''<ref>[[Alfred V. Aho]], Ravi Sethi, [[Jeffrey Ullman]]: ''Compilers: Principles, Techniques and Tools.'' Addison-Wesley, 1986</ref> 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 ''[[Stephen Cole Kleene|Kleenes]] Algorithmus''<ref name="Kleene56" /><ref name="HopcroftUllman94">{{Literatur |Autor=[[John E. Hopcroft]], [[Jeffrey Ullman|Jeffry D. Ullman]] |Titel=Einführung in die Automatentheorie, formale Sprachen und Komplexitätstheorie |Verlag=Addison-Wesley |Ort=Bonn |Datum=1994 |ISBN=3-89319-744-3}}</ref> aus einem nichtdeterministischen endlichen Automaten konstruiert werden. Kleenes Algorithmus erzeugt meist sehr lange reguläre Ausdrücke. Die ''Zustands-Elimination''<ref name="HopcroftUllman94" /> (deutsch eigentlich: „Zustands-Eliminierung“) liefert in der Praxis meist kürzere reguläre Ausdrücke. Im
==== Syntax ====
Die Syntax definiert genau, wie reguläre Ausdrücke aussehen.
Reguläre Ausdrücke sind immer über
# <math>\varnothing</math> (das spezielle Symbol für die [[leere Menge]]) ist ein regulärer Ausdruck.
# für alle <math>
# Sind <math>x</math> und <math>y</math> reguläre Ausdrücke, so sind auch <math>(x | y)</math> (Alternative), <math>(xy)</math> ([[Konkatenation (Wort)|Verkettung]]) und <math>(x^*)</math> ([[Kleenesche Hülle]], Kleene-Stern) reguläre Ausdrücke.
Zeile 32:
Ein regulärer Ausdruck beschreibt eine formale Sprache, also eine Menge von [[Wort (theoretische Informatik)|Wörtern]] (Zeichenketten). Die Definition der Semantik lässt sich analog zur Syntaxdefinition beschreiben. Dabei bezeichnet <math>\mathcal{L}(r)</math> die formale Sprache, die durch den regulären Ausdruck <math>r</math> spezifiziert wird.
# <math>\mathcal{L}(\varnothing) = \emptyset</math>
#: Das
# für alle <math>
#: Jeder Repräsentant eines Zeichens aus dem Alphabet spezifiziert die Sprache, die nur
# sind <math>x</math> und <math>y</math> reguläre Ausdrücke, so gilt:
#* <math>\mathcal{L}(x | y)=\mathcal{L}(x) \cup \mathcal{L}(y)</math>
Zeile 41:
#: 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.
#* <math>\mathcal{L}(x^*) = \{\, \alpha_1 \dots \alpha_n \,|\, n\in\N_0,\, \alpha_1,\dots,\alpha_n\in\mathcal{L}(x) \,\}</math>
#: Die kleenesche Hülle
Enthält die Syntaxdefinition regulärer Ausdrücke auch die Konstante <math>\epsilon</math>, so ist deren Bedeutung definiert als <math>\mathcal{L}(\epsilon)=\{\varepsilon\}</math>, also die Sprache, die nur das [[Leeres Wort|leere Wort]] <math>\varepsilon</math> enthält.
Zeile 84:
=== Ein Zeichen aus einer Auswahl ===
Mit eckigen Klammern
Beispielsweise bedeutet ein [[Zirkumflex]] '''<code>^</code>''' am Anfang einer Zeichenklassendefinition, dass die Zeichenklasse negiert bzw. invertiert wird (im Sinne der [[Komplement (Mengenlehre)|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 ('''<code>-</code>'''). Zudem unterscheiden sich hier die Regexp-Auswerter („regex engines“) (zum Beispiel POSIX und PCRE) in einigen Punkten voneinander. Steht ein Bindestrich <code>-</code> zwischen zwei Zeichen in der Klassendefinition, zum Beispiel <code>[a-g]</code>, so ist er als Bis-Strich zu verstehen, das heißt als Beschreibung eines Zeichenintervalls oder Zeichenbereichs bezüglich der [[American Standard Code for Information Interchange|ASCII]]-Tabelle. Das genannte Beispiel wäre äquivalent zu <code>[abcdefg]</code>. Am Anfang oder Ende einer Zeichenklasse stehende Bindestriche werden als das Zeichen selbst interpretiert.
Zeile 143:
|-
|style="font-size:smaller"| '''Anmerkungen:'''
{{FNZ|ZK1|Das auch als „[[geschütztes Leerzeichen]]“ bekannte Zeichen mit der Unicode-Nummer 160 (hex: A0) (entspricht dem [[Entitäten in Auszeichnungssprachen|HTML-Entity]] &nbsp;) wird von der Klasse [:space:] möglicherweise nicht gefunden und muss separat anhand des [[Codepoint|
{{FNZ|ZK2|Was Buchstaben sind, ist in üblichen Betriebssystemen ''locale''-abhängig, also abhängig von der eingestellten Region und Sprache.<ref>[http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_03_05 RE Bracket Expression], IEEE Std 1003.1, The Open Group Base Specifications, 2004</ref>}}
|}
Zeile 246:
=== Look-around assertions ===
[[Perl (Programmiersprache)|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.<ref>
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.
Zeile 262:
| <code>'''(?<!'''<span style="color:darkgreen">''Ausdruck''</span>''')'''</code> || negative look-behind assertion || <span style="color:darkgreen">''Ausdruck''</span> darf nachfolgendem '''Ausdruck''' nicht vorausgehen || <code>(?<!<span style="color:darkgreen">''Ausdruck''</span>)'''Ausdruck'''</code>
|}
Look-arounds werden nicht nur von Perl und [[Perl Compatible Regular Expressions|PCRE]], sondern unter anderem auch von [[Java (Programmiersprache)|Java]], [[.Net-Framework|.NET]] und [[Python (Programmiersprache)|Python]] unterstützt. [[JavaScript]] interpretiert ab Version 1.5 positive und negative Look-Aheads.<ref>
; Beispiel: <code>\s(?=EUR)</code> steht für ein „Whitespace“-Zeichen (d. h. Leerzeichen oder Tabulator), dem die Zeichenkette <code>EUR</code> folgt. Im Gegensatz zu <code>\sEUR</code> gehört hier <code>EUR</code> nicht zu einer passenden Zeichenkette (englisch: „matched character string“).
Zeile 288:
=== 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|
{| class="wikitable"
| <code>'''(?('''<span style="color:darkgreen">''Bedingung''</span>''')'''<span style="color:darkgreen">''wahr-Ausdruck''</span>'''<nowiki>|</nowiki>'''<span style="color:darkgreen">''falsch-Ausdruck''</span>''')'''</code> || Wenn
|}
Ist der ''falsch-Ausdruck'' leer, so kann der senkrechte Strich ('''<code>|</code>''') entfallen. Als ''Bedingung'' kann u. a. eine ''Look-around assertion'' oder die Nummer einer [[#Gruppierungen und Rückwärtsreferenzen|Gruppierung]] angegeben werden, die zutreffen muss, damit der ''wahr-Ausdruck'' Anwendung findet.
'''Beispiel'''
: Mit
== Beispiele ==
Die folgende Tabelle zeigt einige reguläre Ausdrücke und jeweils dazu passende [[Zeichenkette|Zeichenketten]]:<ref>{{Internetquelle |url=https://cs.lmu.edu/~ray/notes/regex/ |titel=regex |abruf=2024-06-22}}</ref>
{| class="wikitable"
|'''Regulärer Ausdruck'''
|'''Passende Zeichenketten'''
|-
| <code>'''hello'''</code>
| <code>hello</code>
|-
| <code>'''<nowiki>gray|grey</nowiki>'''</code>
| <code>gray</code>, <code>grey</code>
|-
| <code>'''<nowiki>gr(a|e)y</nowiki>'''</code>
| <code>gray</code>, <code>grey</code>
|-
| <code>'''gr[ae]y'''</code>
| <code>gray</code>, <code>grey</code>
|-
|<code>'''b[aeiou]bble'''</code>
|<code>babble</code>, <code>bebble</code>, <code>bibble</code>, <code>bobble</code>, <code>bubble</code>
|-
|<code>'''<nowiki>[b-chm-pP]at|ot</nowiki>'''</code>
|<code>bat</code>, <code>cat</code>, <code>hat</code>, <code>mat</code>, <code>nat</code>, <code>oat</code>, <code>pat</code>, <code>Pat</code>, <code>ot</code>
|-
|<code>'''colou?r'''</code>
|<code>color</code>, <code>colour</code>
|-
|<code>'''<nowiki>rege(x(es)?|xps?)</nowiki>'''</code>
|<code>regex</code>, <code>regexes</code>, <code>regexp</code>, <code>regexps</code>
|-
|<code>'''go*gle'''</code>
|<code>ggle</code>, <code>gogle</code>, <code>google</code>, <code>gooogle</code>, ...
|-
|<code>'''go+gle'''</code>
|<code>gogle</code>, <code>google</code>, <code>gooogle</code>, ...
|-
|<code>'''g(oog)+le'''</code>
|<code>google</code>, <code>googoogle</code>, <code>googoogoogle</code>, ...
|-
|<code>'''z{3}'''</code>
|<code>zzz</code>
|-
|<code>'''z{3,6}'''</code>
|<code>zzz</code>, <code>zzzz</code>, <code>zzzzz</code>, <code>zzzzzz</code>
|-
|<code>'''z{3,}'''</code>
|<code>zzz</code>, <code>zzzz</code>, <code>zzzzz</code>, ...
|-
|<code>'''Hello\nworld'''</code>
|<code>Hello</code><br><code>world</code>
|}
== Literatur ==
Zeile 314 ⟶ 367:
== Weblinks ==
* [[b:en:Regular Expressions/POSIX Basic Regular Expressions|POSIX Basic Regular Expressions bei Wikibooks (englisch)]]
* [[b:en:Regular Expressions/POSIX-Extended Regular Expressions|POSIX Extended Regular Expressions bei Wikibooks (englisch)]]
* [[b:en:Regular Expressions/Perl-Compatible Regular Expressions|Perl-Compatible Regular Expressions bei Wikibooks (englisch)]]
* [http://www.lrz-muenchen.de/services/schulung/unterlagen/regul/ Reguläre Sprachen, reguläre Ausdrücke]
* [http://hwlang.de/theor/regulaerer-ausdruck.htm Reguläre Ausdrücke ausprobieren]
* [http://www.opengroup.org/onlinepubs/009695399/toc.htm POSIX-Spezifikation für reguläre Ausdrücke] (englisch)
* [http://perldoc.perl.org/perlre.html Perl-Syntax regulärer Ausdrücke] (englisch)
Zeile 322 ⟶ 379:
=== Software ===
* [https://www.debuggex.com/ Online visual regex tester]
* [
* [
== Einzelnachweise ==
|