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?
quelle
grep
,sed
undawk
. Vim verwendet seine eigene Sorte, ebenso wie Perl.*
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.Antworten:
Wie bereits erwähnt, wird das Argument durch die
-name
Optionfind
als 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]ata
kann 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 .
quelle
[Rr]eading[Tt]est[Dd]ata
scheint sowohl als Globus als auch als regulärer Ausdruck gültig zu sein, und ich glaube, dass beide Interpretationen dieselbe "Bedeutung" haben. Die-name
Option vonfind
behandelt 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
,foo123
etc.Wenn als regulärer Ausdruck interpretiert, wird diese übereinstimmen
fo
,foo
,foooooo
etc.quelle