Was ist die Definition eines regulären Ausdrucks?

10

Ich habe mich kürzlich mit Ghoti freundschaftlich darüber gestritten, was in den Kommentaren zu meiner Antwort auf diese Frage ein regulärer Ausdruck ist . Ich habe behauptet, dass das Folgende ein regulärer Ausdruck ist:

`[Rr]eading[Tt]est[Dd]ata`

Ghoti war anderer Meinung und behauptete, es sei stattdessen ein Dateiglob. Die Glob- Seite auf Wikipedia behauptet, dass (Hervorhebung von mir):

Globs enthalten keine Syntax für den Kleene-Stern, die mehrere Wiederholungen des vorhergehenden Teils des Ausdrucks ermöglicht. Daher werden sie nicht als reguläre Ausdrücke betrachtet, die einen größeren Satz regulärer Sprachen über ein bestimmtes endliches Alphabet beschreiben können.

Es gibt jedoch kein Zitat für diese Behauptung, was darauf hinweist, dass es sich nur um die Meinung eines bestimmten Wikipedia-Herausgebers handelt.

Die Single UNIX ® -Spezifikation, Version 2 , besagt, dass ein Basic Regular Expression (BRE) sogar ein einzelnes Zeichen sein kann:

Ein gewöhnliches Zeichen ist ein BRE, das mit sich selbst übereinstimmt: Jedes Zeichen im unterstützten Zeichensatz, mit Ausnahme der in BRE-Sonderzeichen aufgeführten BRE-Sonderzeichen.

Was ist also die Definition eines regulären Ausdrucks in der * nix-Welt und schließt diese Definition Dateiglob aus?

terdon
quelle
6
In der theoretischen CS ist ein regulärer Ausdruck eine Beschreibung einer regulären Sprache, die von einem endlichen Automaten erkannt werden kann. In der Unix-Welt ist es viel komplizierter und es gibt keine einheitliche Definition. Es gibt 2 regex Dialekte in der POSIX - Spezifikation: erweitert und einfach, die durch Werkzeuge verwendet werden mag grep, sedund awk. Vim verwendet seine eigene Sorte, ebenso wie Perl.
jw013
Nach dieser Definition ist ein Dateiglob also ein BRE, oder?
Terdon
2
Nein, ein Dateiglob ist KEINE BRE - warum denkst du, dass es so ist? Wenn Sie die POSIX-Beschreibung von BRE und die POSIX-Beschreibung von Globbing lesen, werden Sie feststellen, dass sie nicht identisch sind. *Hat zum Beispiel zwei verschiedene Bedeutungen in BRE und Globs. Hinweis: Ich glaube nicht , der Begriff glob überall in der POSIX - Spezifikation verwendet wird - es ist Pattern Matching statt genannt und beschrieben in dem Shell - Sprache Kapitel.
jw013
Siehe auch Warum funktioniert mein regulärer Ausdruck in X, aber nicht in Y?
Gilles 'SO - hör auf böse zu sein'

Antworten:

10

Wie bereits erwähnt, wird das Argument durch die -nameOption findals Glob behandelt, nicht als regulärer Ausdruck.

Ob eine Zeichenfolge als Glob oder Regex oder nur als einfache Zeichenfolge interpretiert wird, hängt davon ab, was für die Interpretation verwendet wird. Es ist eine Frage des Kontexts. Die Zeichenfolge in Ihrem Beispiel [Rr]eading[Tt]est[Dd]atakann auf verschiedene Arten ausgewertet werden. Was sie ist, hängt jedoch davon ab, wie Sie sie verwenden. Verwenden Sie es als Glob, es ist ein Glob. Verwenden Sie es als Regex, es ist ein Regex. Bei der Frage, woher diese stammt , beschrieb das OP die Zeichenfolge als regulären Ausdruck. Daher können wir davon ausgehen, dass er vorhatte, es als Regex zu interpretieren.

Ein einzelnes Zeichen kann absolut auch ein regulärer Ausdruck sein. Es kann auch eine Zeichenfolge sein, und es kann auch ein Glob sein. Es könnte als Byte oder Winzling interpretiert werden, wenn Sie möchten. Es hängt alles vom Kontext ab.

Es gibt eine Reihe von Spezifikationen für reguläre Ausdrücke in verschiedenen Formen. BRE und ERE sind gut dokumentiert. PCRE bietet zahlreiche Funktionen. Viele Regex-Interpreter werden beispielsweise "alle ERE und einige PCRE" implementieren. Oder sie machen ERE abzüglich einiger Funktionen. Wenn Sie sich an formale Spezifikationen halten, beanspruchen viele Tools Regex-Unterstützung, die sich als falsch oder unvollständig herausstellt. Wenn Sie die Details kennen, können Sie Ihre Lösungen an die Sammlung von Funktionen anpassen, die in jedem Tool verfügbar sind, das Ihren regulären Ausdruck bewertet.

Also ... wenn Sie nach Definitionen suchen, die Globs "ausschließen", betrachten Sie dies aus der falschen Perspektive. Was es ist, hängt davon ab, wie Sie es verwenden .

Ghoti
quelle
7

[Rr]eading[Tt]est[Dd]atascheint sowohl als Globus als auch als regulärer Ausdruck gültig zu sein, und ich glaube, dass beide Interpretationen dieselbe "Bedeutung" haben. Die -nameOption von findbehandelt das Argument jedoch als Glob und nicht als regulären Ausdruck.

Diese Unterscheidung ist wichtig, wenn Sie ein Argument wie foo*angeben, das sowohl ein gültiger Glob als auch ein gültiger regulärer Ausdruck ist, aber je nach Interpretation unterschiedliche Bedeutungen hat:

Wenn als glob Muster interpretiert, wird dieses Spiel foo, foobar, foo123etc.

Wenn als regulärer Ausdruck interpretiert, wird diese übereinstimmen fo, foo, fooooooetc.

lk-
quelle
Danke, ich sehe den Unterschied zwischen einem Glob-Muster und einem Regex. Was ist die formale Definition eines regulären Ausdrucks?
Terdon
1
Ich weiß nicht, ob es eine einzige Definition für "reguläre Ausdrücke" gibt, wie der Begriff allgemein verwendet wird. Es gibt verschiedene Syntaxspezifikationen, wie reguläre POSIX-Ausdrücke oder reguläre Perl-Ausdrücke, die andere "Funktionen" wie Rückreferenzen oder Lookaheads enthalten. Dies sind möglicherweise keine regulären Ausdrücke mehr im strengsten Sinne (im Kontext regulärer formaler Sprachen), werden aber dennoch als solche bezeichnet.
lk