Regular Expression/Zeichenklassen
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
- entspricht alnum:
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. |
|
Anmerkungen: |
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.