GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Die Definition eines regulären Ausdrucks?

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 .


Linux
  1. Warum funktioniert der reguläre Ausdruck in X, aber nicht in Y?

  2. Müssen Regex-Zeichen in Sed maskiert werden, um als Regex-Zeichen interpretiert zu werden?

  3. Warum funktioniert `\d` nicht in regulären Ausdrücken in sed?

  4. So verwenden Sie Lookahead, um Sonderzeichen in einem regulären Ausdruck auszuschließen

  5. Linux GUI Regular Expression File Renamer (mit Substitution)

Erste Schritte mit regulären Ausdrücken

Reguläre Ausdrücke in Grep (Regex)

Bash + Name durch regulären Ausdruck überprüfen?

Bash:Reguläre Ausdrücke als Ersatz?

10 praktische Beispiele für Regex mit grep

grep Extraktnummernbereich