Regular Expression/Zeichenklassen

Aus Foxwiki

Zeichenklassen

Vordefinierten Zeichenklassen

In vielen neueren Implementationen können innerhalb der eckigen Klammern nach POSIX auch Klassen (vordefinierte Listen) angegeben werden, die selbst wiederum eckige Klammern enthalten.

POSIX Non-standard Perl/Tcl Vim ASCII Description
[:alnum:] [A-Za-z0-9] Alphanumeric characters
[:word:] \w \w [A-Za-z0-9_] Alphanumeric characters plus "_"
\W \W [^A-Za-z0-9_] Non-word characters
[:alpha:] \a [A-Za-z] Alphabetic characters
[:blank:] \s [ \t] Space and tab
\b \< \> (?<=\W)(?=\w)|(?<=\w)(?=\W) Word boundaries
[:cntrl:] [\x00-\x1F\x7F] Control characters
[:digit:] \d \d [0-9] Digits
\D \D [^0-9] Non-digits
[:graph:] [\x21-\x7E] Visible characters
[:lower:] \l [a-z] Lowercase letters
[:print:] \p [\x20-\x7E] Visible characters and the space character
[:punct:] [][!"#$%&'()*+,./:;<=>?@\^_`{| class="wikitable sortable"}~-] Punctuation characters
[:space:] \s \_s [ \t\r\n\v\f] Whitespace characters
\S [^ \t\r\n\v\f] Non-whitespace characters
[:upper:] \u [A-Z] Uppercase letters
[:xdigit:] \x [A-Fa-f0-9] Hexadecimal digits

POSIX Zeichenklassen können nur innerhalb von Klammer-Ausdrücken genutzt werden.

Vordefinierten Zeichenklassen müssen in eckige Klammern

falsch

grep -E '[:alnum:]' Datei
  • findet z. B.  'a', da es eines der Zeichen ':alnum:' ist, aber nicht 'b' oder '1'
  • (die vordefinierte Liste wird nicht als solche interpretiert!)

richtig

grep -E '[[:alnum:]]' Datei
  • findet sowohl 'a', als auch 'b' oder '1', da die vordefinierte Liste nun als "Buchstabe oder Zahl" interpretiert wird
grep -E '[[:alnum:] ]' Datei
  • findet zusätzlich zu Buchstaben und Zahlen auch Leerzeichen
grep -E '[0-9a-zA-Z]' Datei

Zeichenklassen, hierarchisch sortiert

[:cntrl:] — Steuerzeichen. Im ASCII sind das die Zeichen 00 bis 1F und 7F (DEL).

[:print:] — Druckbare Zeichen: [:alnum:], [:punct:] und Leerzeichen

[:blank:]Leerzeichen oder Tabulator

[:space:]Whitespace: Horizontaler und vertikaler Tabulator, Zeilen- und Seitenvorschub, Wagenrücklauf und Leerzeichen

[:graph:] — Graphische Zeichen: [:alnum:] oder [:punct:]

[:punct:] — Satzzeichen wie: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~

[:alnum:]Alphanumerische Zeichen: [:alpha:] oder [:digit:]

[:xdigit:]Hexadezimale Ziffern: 0 bis 9, A bis F, a bis f.

[:digit:] — Die Ziffern 0 bis 9

[:alpha:] — Buchstaben: [:lower:] oder [:upper:]

[:lower:] — Kleinbuchstaben: nicht notwendigerweise nur von a bis z

[:upper:] — Großbuchstaben: nicht notwendigerweise nur von A bis Z

Anmerkung

Was Buchstaben sind, ist im Allgemeinen locale-abhängig, also abhängig von der eingestellten Region und Sprache.

Beispiele für Zeichenklassen, hierarchisch sortiert
  • [:cntrl:] – Steuerzeichen. Im ASCII sind das die Zeichen 00 bis 1F und 7F (DEL).
  • [:print:] – Druckbare Zeichen: [:alnum:], [:punct:] und Leerzeichen
Anmerkungen:

Vorlage:FNZ Vorlage:FNZ

Beispiel

Die Buchstaben "y" und "i" sollen durch "xx" ersetzt werden.

echo -e "Mayer\nMaier\nMeyer\nMeier" | sed 's/[yi]/xx/'

Beachten Sie, dass beim Suchen und Ersetzen immer alle Zeilen komplett ausgegeben werden, unabhängig davon ob Ersetzungen durchgeführt wurden oder nicht. Daher lassen sich mehrere Suchen und Ersetzen Anweisungen gut aneinanderreihen.

"i" und "y" sollen durch "ii" ersetzt werden, sodann "a" und "e" durch "oo"
$ echo -e "Mayer\nMaier\nMeyer\nMeier" | sed -e 's/[iy]/ii/g' -e 's/[ae]/oo/g'
Mooiioor

Vordefinierte Zeichenklassen

Es gibt vordefinierte Zeichenklassen, die allerdings nicht von allen Implementierungen unterstützt werden, da sie lediglich Kurzformen sind und auch durch eine Zeichenauswahl beschrieben werden können.

Wichtige Zeichenklassen sind:

\d digit eine Ziffer [0-9]
\D no digit ein Zeichen, das keine Ziffer ist, also [^\d]
\w wordcharacter ein Buchstabe, eine Ziffer oder der Unterstrich, also [a-zA-Z_0-9] (und evtl. weitere Buchstaben, z. B.  Umlaute)
\W no wordcharacter ein Zeichen, das weder Buchstabe noch Zahl noch Unterstrich ist, also [^\w]
\s whitespace meistens das Leerzeichen und die Klasse der Steuerzeichen \f, \n, \r, \t und \v
\S no whitespace ein Zeichen, das kein Whitespace ist [^\s]
\b leere Zeichenkette am Wortanfang oder am Wortende
\B leere Zeichenkette, die nicht den Anfang oder das Ende eines Wortes bildet
\< leere Zeichenkette am Wortanfang
\> leere Zeichenkette am Wortende
\n newline ein Zeilenumbruch im Unix-Format
\r return ein Zeilenumbruch im Mac-Format
\r\n ein Zeilenumbruch im Windows-Format

Weitere Zeichen

^ steht für den Zeilenanfang (nicht zu verwechseln mit „^“ bei der Zeichenauswahl mittels „[“ und „]“).
$ kann je nach Kontext für das Zeilen- oder Stringende stehen, wobei bei manchen Implementierungen noch ein „\n“ folgen darf. Das tatsächliche Ende wird von \z gematcht.
\ hebt gegebenenfalls die Metabedeutung des nächsten Zeichens auf. Beispielsweise lässt der Ausdruck „(A\*)+“ die Zeichenketten „A*“, „A*A*“, usw. zu. Auf diese Weise lässt sich auch ein Punkt „.“ mit „\.“ suchen, während nach „\“ mit „\\“ gesucht wird.

Weitere Beispiele

[egh]
  • eines der Zeichen „e“, „g“ oder „h“
[0-6]
  • eine Ziffer von „0“ bis „6“ (Bindestriche sind Indikator für einen Bereich)
[A-Za-z0-9]
  • ein beliebiger lateinischer Buchstabe oder eine beliebige Ziffer
[^a]
  • ein beliebiges Zeichen außer „a“ („^“ am Anfang einer Zeichenklasse negiert selbige)
[-A-Z], [A-Z-] bzw. [A-Z\-a-z], allerdings nicht gemäß POSIX)
  • Auswahl enthält auch den Bindestrich „-“, wenn er das erste oder das letzte Zeichen in der Aufzählung einer Zeichenklasse ist bei PCRE, wenn seine Metafunktion innerhalb einer Auswahl durch ein vorangestelltes „\“-Zeichen aufgehoben wird
\<[Aa]+n+[ae]+\>
  • findet alle Wörter, die ungefähr wie Anne oder Anna aussehen, nur mit beliebig vielen "A", "n" und "e" (sofern sie jeweils mindestens ein mal vorkommen). AAnnneeea würde zum Beispiel auch passen.
[Ss]up(er|ra)
  • findet alle Wörter, die ein Super, super, Supra oder supra enthalten.
^digit:
  • findet alle Zeilen, die mit einer Ziffer beginnen.