Ich habe mich kürzlich mit Ghoti darüber gestritten, was einen regulären Ausdruck in den Kommentaren zu meiner Antwort auf diese Frage ausmacht. 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 Dateiklumpen. Die Glob-Seite auf Wikipedia behauptet, dass (Hervorhebung von mir):
Globs enthalten keine Syntax für den Kleene-Stern, der mehrfache
Wiederholungen des vorhergehenden Teils des Ausdrucks erlaubt; daher werden sie nicht
als reguläre Ausdrücke angesehen, die eine größere Menge
regulärer Sprachen über ein beliebiges gegebenes 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-Redakteurs handelt.
Die The Single UNIX ® Specification, 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 BRE-Sonderzeichen
, die unter BRE-Sonderzeichen aufgeführt sind.
Was ist also die Definition eines regulären Ausdrucks in der *nix-Welt, und schließt diese Definition Datei-Globs aus?
Akzeptierte Antwort:
Wie lk- sagte, der -name
Option find
behandelt das Argument als Glob, nicht als regulären Ausdruck.
Ob ein String als Glob oder Regex oder nur als einfacher String interpretiert wird, hängt davon ab, was zum Interpretieren verwendet wird. Es ist eine Frage des Kontexts. Die Zeichenfolge in Ihrem Beispiel, [Rr]eading[Tt]est[Dd]ata
kann auf verschiedene Weise ausgewertet werden, aber was es ist hängt davon ab, wie Sie es verwenden. Verwenden Sie es als Glob, es ist ein Glob. Verwenden Sie es als Regex, es ist eine Regex. Bei der Frage, woher dies stammt, beschrieb das OP die Zeichenfolge als Regex. Daher können wir davon ausgehen, dass er vorhatte, es als Regex zu interpretieren.
Ein einzelnes Zeichen kann durchaus auch eine Regex sein. Es kann auch ein String sein, und es kann auch ein Glob sein. Es könnte als Byte oder Tinyint 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 fügt eine Menge Funktionalität hinzu. Viele Regex-Interpreter implementieren zum Beispiel „alle von ERE und einige von PCRE“. Oder sie machen ERE ohne ein Feature. Wenn Sie sich an formale Spezifikationen halten, behaupten viele Tools eine 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 Ihre Regex auswertet.
Verwandt:Der Befehl `ls` listet die neuesten Verzeichnisinhalte nicht auf?Also … wenn Sie nach Definitionen suchen, die Globs „ausschließen“, sehen Sie das aus der falschen Perspektive. Was es ist wird dadurch bestimmt, wie Sie es verwenden .