Diskussion:Regulärer Ausdruck

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
Diese Diskussionsseite dient dazu, Verbesserungen am Artikel „Regulärer Ausdruck“ zu besprechen. Persönliche Betrachtungen zum Thema gehören nicht hierher. Für allgemeine Wissensfragen gibt es die Auskunft.

Füge neue Diskussionsthemen unten an:

Klicke auf Abschnitt hinzufügen, um ein neues Diskussionsthema zu beginnen.
Zum Archiv
Auf dieser Seite werden Abschnitte ab Überschriftenebene 2 automatisch archiviert, die seit 30 Tagen mit dem Baustein {{Erledigt|1=--~~~~}} versehen sind.

Es gibt mehr als RegExp nach Perl-Syntax[Quelltext bearbeiten]

Man sollte nicht vergessen, dass es auch noch andere Syntax-Formen von regulären Ausdrücken gibt, die nichts mit der im Artikel beschriebenden zu tun hat. So sind die Wildcards * und ? von DOS oder % und _ in SQL-LIKE reguläre Ausdrücke. Vor allem sind Sie dem geneigten Leser vielleicht sogar bekannter ;-) Der Artikel liest sich für mich so, als würde es nur die eine beschriebene Syntax einen Regulären Ausdruck ausmachen. -Arittner 20:20, 9. Nov 2005 (CET)

du verwechselst wildcards mit regulaeren ausdruecken. (siehe auch [1]) --seth 20:54, 9. Nov 2005 (CET)
Die DOS Wildcards und die SQL Syntax sind ebenfalls Möglichkeiten, reguläre Sprachen zu definieren. Den Begriff "Regulärer Ausdruck" kenne ich aber nur für das, was Perl und Grep verwenden, bzw, etwas formaler, was man in der Informatik benutzt (also z.B. a*b2 oder sowas). Mit letzterer Syntax lassen sich aber durchaus auch sprachen definieren, die nicht regulär sind (z.B. anbn). -- D. Dÿsentrieb 23:13, 9. Nov 2005 (CET)
wie definiert man mit dos-wildcards eine regulaere sprache?--seth 23:58, 9 November 2005 (CET)
a* (DOS, syntax) ist Regulär (entspricht a.* in Perl-Syntax - dabei wird ein endliches Alphabet als Grundmenge vorausgesetzt). Man kann aber nicht jede Reguläre Sprache mit solchen Wildcards beschreiben, sie sind weniger mächtig als "echte" reguläre Ausdrücke. Oder was genau ist deine Frage? -- D. Dÿsentrieb 00:25, 10 November 2005 (CET)
Ok, nochmal genauer: jedes "Muster", das Wörter akzeptiert (oder generiert, je nach Perspektieve) definiert eine Sprache. Alle Muster, die sich mit regulären Ausdrücken (Perl Style) definieren lassen, definieren reguläre Sprachen (saher der Name), und alle regulären Sprachen lassen sich durch solche Ausdrücke definieren. Alle Muster, die sich mit DOS- oder LIKE Syntax definieren lassen, definieren ebenfalls reguläre Sprachen, aber nicht alle regulären Sprachen lassen sich durch DOS-Wildcards oder LIKE Muster definieren. -- D. Dÿsentrieb 00:31, 10. Nov 2005 (CET)
ok, ich hatte dich zunaechst missverstanden (obwohl du's gar nicht falsch formuliert hast). sorry, war ne doofe frage. --seth 00:45, 10. Nov 2005 (CET)
@seth - nein verwechseln tu ich da nichts. Reguläre Ausdrücke und Reguläre Sprachen in der theoretischen Informatik definieren keine spezifische Syntax. Sie stellen (wie der Artikel ja schon richtig anfängt) formale Sprachen dar. Das die Bezeichnung "Regulärer Ausdruck" so stark von der Perl Syntax gefärbt ist, so dass es immer wieder gleich gesetzt wird, gebe ich ja gerne zu - bemängele das aber auch. Nun sind die Wildcards in DOS mit * und ? ganz sicher eine formale Sprache, um Zeichenkettenmuster zu beschreiben. Und die formale Sprache der Wildcards sind auch ohne Zweifel vom Typ 3 in der Chomsky-Hierarchie. Und dort das Zitat: Reguläre Sprachen können alternativ auch durch reguläre Ausdrücke beschrieben werden und die regulären Sprachen sind genau die Sprachen, die von endlichen Automaten erkannt werden können. Sie werden gewöhnlich genutzt, um Suchmuster oder die lexikalische Struktur von Programmiersprachen zu definieren.
@Dÿsentrieb - den Umkehrschluss, dass alle Untermengen von Perl RegExp Reguläre Ausdrücke sein müssen ist nicht ganz richtig, denn gerade aktuelle Perl Ausdrücke erlauben Rückwärtsreferenzen. Damit ist Perl-Regexp Grammatik nicht mehr eindeutig rechtsregulär oder linksregulär. Damit müssen auch Untermengen von Perl RegExp keinen reine Reguläre Ausdrücke sein. Davon unabhängig, wollte ich eigentlich nur sagen, dass Perl RegExp nur eine bestimmte Syntax hat, aber nicht die alleinige Reguläre Grammatik ist. Es gibt durchaus einfachere und erheblich komplexere Grammatiken. --Arittner 13:30, 10. Nov 2005 (CET)
Du hast recht, mit Perl lassen sich auch nicht-reguläre Sprachen definieren (z.B. die Klammersprache /(a+)b\1/) - die Bezeichnung "Regulärer Ausdruck" ist dann eigentlich irreführend. Vermutlich sollte man die Möglichkeiten von so genannten Regulären Ausdrücken in verschiedenen Programmiersprachen im Artikel besser rausarbeiten. Die "formale" Definition von "regulärer Ausdruck" ist wohl einfach alles, was eine Reguläre Grammatik definiert (also z.B. auch eine BNF für eine reguläre Sprache, wie S: "abc" oder sowas) - das unterscheidet sich aber deutlich von der "populären" Verwednung des Begriffes "Regulärer Ausdruck" in bezug auf Perl, grep, sed, awk und diverse andere Programme, die eine ähnliche syntax verwenden. Sollte man irgendwie einbauen... -- D. Dÿsentrieb 14:10, 10. Nov 2005 (CET)


Um den Artikel nicht zu sprengen, sollte man vielleicht einen einen Spezialartikel anlegen, welcher auf die verschiedenen (vielfaeltigen) Varianten der Syntax von regulaeren Ausdruecken eingeht (z.B. mit Tabellen). Denn z.B. '(' ist in qed/vi eben nicht ein Meta-Character sondern steht fuer eine Klammer im Text ('\(' steht dort fuer den Beginn einer Gruppierung). Diese Unterschiede sind sicherlich fuer Anfaenger verwirrend, so dass ein extra Artikel gerechtfertigt ist. Wenn mir niemand zuvorkommt, werde ich einen solchen Artikel anlegen. --Gms 18:34, 9. Jun. 2007 (CEST)[Beantworten]

ich wuerde dich dabei unterstuetzen. beachte aber, dass das ganz schon kompliziert und unuebersichtlich werden kann. zum einen, weil es sehr viel software gibt (en:Comparison_of_regular_expression_engines) und zum anderen, weil viele editoren auch mehrere varianten zulassen. in vim gibt es beispielsweise vier (!) verschiedene regexp-modi \v, \m, \V und \M. wie wuerdest du diesen spezialisierten artikel aufbauen wollen? -- seth 22:30, 17. Jun. 2007 (CEST)[Beantworten]

grundsätzliches[Quelltext bearbeiten]

Die Aussage, dass man mit regulären Ausdrücken die Syntax von Programmiersprachen prüfen kann, ist in der Allgemeinheit, in der sie hier formuliert ist, falsch. Mit regulären Ausdrücken kann man Teilaspekte der Syntax (z.B Identifier, String, Gleitkommazahl) überprüfen. Es ist aber zum Beispiel nicht möglich, die Korrektheit eines Formelausdrucks zu überprüfen. Ich bitte den Autor des Artikels, dies zu korrigieren. (nicht signierter Beitrag von 80.141.66.33 (Diskussion) )

Du hast Recht. Mit regulären Ausdrücken lässt sich nur die lexikalische Analyse durchführen. Ich passe das mal an. --jpp ?! 13:25, 31. Aug. 2007 (CEST)[Beantworten]

woher kommen reguläre ausdrücke?[Quelltext bearbeiten]

Was mir fehlt: Woher kommen reguläre Audrücke? wer hat sie erfunden? Seit wann gibt es sie? --84.60.21.122 18:29, 5. Apr. 2008 (CEST)[Beantworten]

Wären Beispiele für gebräuchliche Ausdrücke nicht sinnvoll?

nein, denn so einfach ist es nicht, vgl. [2]. -- seth 12:27, 15. Jun. 2008 (CEST)[Beantworten]
Aber ein paar Beispiele wuerden schon helfen den Artikel auch fuer Programmierleihen
verstaendlicher zu machen. --Go2sh 03:54, 28. Aug. 2008 (CEST)[Beantworten]
Es muss ja nichts so schwieriges wie Telefonnummern sein. Wie wäre es mit Postleitzahlen?: ^[0-9]{5}$ oder E-Mail-Adressen: /[\.a-z0-9_-]+@[\.a-z0-9-]+/i (da gibt es zwar auch noch viele andere Versionen, aber ich denke so ist das zumindest nicht ganz falsch. Wobei ich mir nicht sicher bin, ob alle Zeichen berücksichtigt wurden, die in E-Mail-Adressen vorkommen.) --Nico Düsing (Diskussion) 02:45, 31. Aug. 2008 (CEST)[Beantworten]
email-adressen. nicht so schwierig wie telephonnummern. dir ist klar, daß rfc-822 so schweinereien wie rekursiv verschachtelte kommentare erlaubt, die mit einer regulären sprache überhaupt nicht auszudrücken sind? "mastering regular expressions" hat eine regexp, die nur eine verschachtelungsebene erkennt, aber sonst alles was so erlaubt ist. die ist dann gut 4kB lang. -- 03:43, 31. Aug. 2008 (CEST)[Beantworten]
ich stimme zwar zu, dass e-mail-adressen kein gutes (anfaenger-)beispiel darstellen, allerdings koennen mittels regexps mehr als nur regulaere sprachen abgedeckt werden. mittlerweile sind sogar rekursionen bis zu einem gewissen grad moeglich, siehe "perldoc perlre". -- seth 12:24, 31. Aug. 2008 (CEST)[Beantworten]

Syntax-Unterschiede z.B. bei Zeichenliteralen[Quelltext bearbeiten]

Es bahnt sich gerade ein kleiner Edit war zum Thema Zeichenliterale an, weshalb ich das hier diskutieren möchte. Das Thema ist Teil der Syntaxbeschreibung, die leider implementationsabhängig ist, obwohl es einen POSIX-Standard gibt. Im Artikel heißt es: 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. Implementationsunterschiede werden aber in diesem Artikel nicht deutlich gemacht.

Der aktuelle Streit geht um die Spezialfrage, wie oktale Zahlen als Literale ausgedrückt werden können. Jemand, der unangemeldet arbeitet, bezieht sein Wissen aus Escape-Sequenz#Escape-Sequenzen in C und verwandten Programmiersprachen und besteht auf \ooo, während ich und andere dort \0ooo angegeben haben. Ich habe das mit dem in bash(1) und zsh(1) eingebauten Kommando echo -e '\101' ausprobiert und herausgefunden, dass es nicht funktioniert (Ergebnis: \101). echo -e '\0101' funktioniert aber (Ergebnis: A). Genauso verhält sich die tcsh(1) (hier muss man allerdings das -e weglassen), obwohl man die dazugehörige Manpage anders verstehen könnte. Zu meiner Überraschung verhält sich das Programm /bin/echo aus den GNU core utilities anders und interpretiert beide Schreibweisen als A. Die mit der führenden Null scheint aber portabler zu sein.

Frage: Soll die Syntaxbeschreibung im Artikel die Syntax einer bestimmten RegEx-Implementierung beschreiben oder versuchen, alle Implementierungen (mit ihren Abweichungen und Bugs) zu erfassen? Oder beschreiben wir lieber nur den POSIX-Standard, auch wenn verschiedene Implementierungen davon abweichen? --Thüringer ☼ 14:48, 27. Nov. 2008 (CET)[Beantworten]

schwierig. erst mal zur allgemeinen frage:
alle grossen/wichtigen regexp-implementierungen unterscheiden sich (wenn auch haeufig nur geringfuegig) oder bieten mehrere verschiedene syntaxen an. im linux cli wurd haeufig die unterscheidung zwischen BRE und ERE getroffen. vim dagegen hat sein eigenes sueppchen gebraut, aber eine der leistungsfaehgisten regexp-implementierungen auf die beine gestellt, die selbst gegenueber der perl-regexp-engine vorteile hatte. php kennt pcre ( perl) und posix. und das genuegt eigentlich schon an beispielen, um das existierende chaos anzudeuten. je nachdem aus welcher welt man kommt, haelt man nun die einen oder die anderen syntaxen fuer die massgeblichen. alle (selbst nur alle grossen) regexp-implementierungen koennen wohl nicht erklaert werden und wuerden darueber hinaus das verstaendnis (stichwort: OMA) erschweren. wenn man sich aber eine bestimmte implementierung heraussucht, fuehrt das vermutlich zu unnoetigen, ewigen diskussionen.
so wie wir es momentan machen, naemlich eine mixtur zu erklaeren und dabei an gegebenen stellen darauf hinzuweisen, dass es jeweils implementationsabhaengig ist, halte ich fuer einen guten mittelweg. denn der artikel soll ja kein manual sein, sondern ein enzyklopaedischer artikel, der also die prinzipien beschreibt.
zum speziellen problem: ein auszug aus dem perl-manual:
There is no limit to the number of captured substrings that you may use. However Perl also uses \10, \11, etc. as aliases for \010, \011, etc. (Recall that 0 means octal, so \011 is the character at number 9 in your coded character set; which would be the 10th character, a horizontal tab under ASCII.) Perl resolves this ambiguity by interpreting \10 as a backreference only if at least 10 left parentheses have opened before it. Likewise \11 is a backreference only if at least 11 left parentheses have opened before it. And so on. \1 through \9 are always interpreted as backreferences. (perldoc perlre)
das ganze ist dort also noch mal etwas komplizierter. sobald die zahlen dreistellig werden, funzt die schreibweise mit der fuehrenen null uebrigens in perl nicht mehr:
geht: \101, \12, \012, \007, \07
geht nicht: \7, \0101
keine der varianten \0nnn \nnn ist also wirklich von praktischem vorteil. mir persoenlich ist es wurscht, welche im artikel steht. um aber weitere edits in dieser richtung zu verhindern, sollte entweder als html-comment oder tatsaechlich im artikel auf die jeweils andere schreibweise hingewiesen werden. -- seth 16:55, 27. Nov. 2008 (CET)[Beantworten]

Was ist mit [. … .] und [= … =] ?[Quelltext bearbeiten]

Es gibt noch weit mehr als das was bisher bei den []-Ausdrücken steht. :-/ --82.83.126.246 11:07, 2. Jun. 2009 (CEST)[Beantworten]

Morphologie natürlicher Sprachen[Quelltext bearbeiten]

Aus dem Artikel:

Die Mächtigkeit regulärer Ausdrücke reicht aus, um – von wenigen Ausnahmen abgesehen – die Morphologie einer natürlichen Sprache zu beschreiben.

Eine solche Aussage sollte dringlichst mit konkreten Quellen versehen werden.--Mrmryrwrk'soch'os! 14:48, 17. Okt. 2009 (CEST).[Beantworten]

Ich stimme dir vollkommen zu. Zumal die Behauptung auch noch bei Theoretische Grundlagen untergebracht ist. Ob Ausnahmen innerhalb der Sprache gemeint sind oder einige Sprachen ausgenommen sind, ist auch nicht klar. Nur aufs Deutsche bezogen: Wie sollen reguläre Ausdrücke die Pluralbildung beschreiben? (Frau/Frauen, Tau/Taue, Sau/Säue, Bau/Bauten) Keine Quellen: ich entferne es. --Zahnradzacken 12:47, 26. Jan. 2010 (CET)[Beantworten]
Ist richtig so. Die Aussage lässt sich mehr noch relativ leicht widerlegen: Nimm den Plural von Bank…--Mrmryrwrk'soch'os! 19:06, 26. Jan. 2010 (CET).[Beantworten]
Natürlich banker, weil du bestimmt gerade vom Dänischen sprachst ;) --Zahnradzacken 19:34, 26. Jan. 2010 (CET)[Beantworten]

Definition doppelt?[Quelltext bearbeiten]

In der 4. Zeile der Definition

4. Sind x und y reguläre Ausdrücke, so sind auch (x|y) (Alternative), (xy) (Verkettung) und x * (Kleenesche Hülle) reguläre Ausdrücke.

verstehe ich nicht, welche Fälle x* erfassen soll, die noch nicht erfasst sind. Ist die Verkettung bei mehrmaliger Ausführung auf eine Leerelement-haltige Menge nicht gleichbedeutend? -- Lutz 08:35, 4. Feb. 2010 (CET)[Beantworten]

Beispiele "unter anderem"[Quelltext bearbeiten]

Unter Beispiele heißt es: Wenn das Alphabet aus den Buchstaben a , b und c besteht, also Σしぐま = { a , b , c } , dann lassen sich die folgenden Sprachen mit den entsprechenden regulären Ausdrücken beschreiben: Die angegebenen "folgenden Sprachen" erwecken den Eindruck als ob sich c anders als a und b verhielte. Deshalb denke ich sollte es besser lauten: Wenn das Alphabet aus den Buchstaben a, b und c besteht, also Σしぐま = { a , b , c }, dann lassen sich unter anderem die folgenden Sprachen mit den entsprechenden regulären Ausdrücken beschreiben: --TumtraH-PumA (Diskussion) 17:43, 22. Mär. 2018 (CET)[Beantworten]

Binärzeichen[Quelltext bearbeiten]

Ich finde "binär" im ganzen Artikel nicht, würde aber einfach gerne mal direkt Binärzeichen mit grep finden können, z.B. ... --Quetsch mich aus, ... itu (Disk) 11:30, 12. Dez. 2019 (CET)[Beantworten]

Es gibt viele Dialekte des RegExp und auch in der ux-Welt ist nicht immer jedes grep gleich schlau.
Viele verstehen: \u1234
Viele erlauben den Einbau direkt, notfalls in [ ] als Einzelzeichen eingeschlossen.
Es kann sein, dass bestimmte ux-Kommandozeilen bei bestimmten höherwertigen oder mit Sonderbedeutung belegten Binärcodes das anders interpretieren.
„Binär“ ist in diesem Sinn keine Eigenschaft des RegExp als solchem, sondern ein dialekt- und umgebungsabhängiges Kodierungsproblem, und insofern fehlt dem Artikel eigentlich nix.
VG --PerfektesChaos 13:55, 12. Dez. 2019 (CET)[Beantworten]
Was grep betrifft ist nach leidlicher Suche, jetzt der einzige Lichtblick der Parameter -P mit dem \123 und \x12 funktionieren. --Quetsch mich aus, ... itu (Disk) 15:14, 12. Dez. 2019 (CET)[Beantworten]

WP verwendet intensiv Lua. Dennoch fehlt hier jeglicher Hinweis auf die abweichende Syntax, insbesondere Einsatz von % statt \--Klaus-Peter (aufunddavon) 06:50, 9. Jul. 2020 (CEST)[Beantworten]

Bedingte Ausdrücke[Quelltext bearbeiten]

Sowohl in PHP als auch in Perl wird der im Beispiel zu den bedingten Ausdrücken angegebene reguläre Ausdruck bemängelt:

<?php
foreach (['1', '(2)', '34', '(567)', '(42', '3)'] as $e) echo preg_match('/(?(\()\(\d+\)|\d+)/', $e);
?>
> PHP Warning:  preg_match(): Compilation failed: subpattern name expected at offset 3

## Perl
for ("1", "(2)", "34", "(567)", "(42", "3)") { print $_ if $_ ~~ /(?(\()\(\d+\)|\d+)/; }
Perl 5> Unknown switch condition (?(...)) in regex; marked by <-- HERE in m/(?(\ <-- HERE ()\(\d+\)|\d+)/
Perl 6> Quantifier quantifies nothing

Hat jemand das Knowhow, den Abschnitt zu den bedingten Ausdrücken bzw. das Beispiel in ihm zu korrigieren? --2003:C8:5737:E930:640E:11F3:F7D6:5772 09:25, 11. Jun. 2023 (CEST)[Beantworten]

Abschnitt vor 2 Tagen überarbeitet und das fehlerhafte Beispiel korrigiert. --2003:C8:572E:3511:6045:7682:A5F1:7AFA 08:19, 20. Jun. 2023 (CEST)[Beantworten]

Wunderbar, es hat sich jemand erbarmt. Bitte jetzt noch erläutern, wer aus dem englischen regular expression "regulärer Ausdruck" gemacht hat

--2003:E5:9F2D:EE00:227:10FF:FE35:AC6C 19:54, 2. Feb. 2024 (CET)[Beantworten]