Zeichendarstellung

(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)

Bei dieser Gruppe von Metazeichen geht es nur darum, eine möglichst einfache und angenehme Darstellung für sonst schwer darstellbare Zeichen zu finden.

Abkürzungsmetazeichen

Viele Programme kennen Abkürzungen für Kontrollzeichen, die sonst schwierig einzugeben wären und die außerdem vom Betriebssystem abhängen können:

\a

Alarm (»beep«, ein Zeichen, das sich bei der Ausgabe akustisch bemerkbar macht). Normalerweise ASCII <BEL>, oktal 007.

\b

Backspace. ASCII <BS>, oktal 010. (In vielen Dialekten ist ˹\b˼ nur in Zeichenklassen ein Abkürzungszeichen; sonst aber das Metazeichen für die Wortgrenze, siehe den Abschnitt , ....">Wortgrenzen: \b, \B, \<, \>, ....)

\e

Escape. Normalerweise ASCII <ESC>, oktal 033.

\f

Seitenvorschub (Formfeed). Normalerweise ASCII <FF>, oktal 014.

\n

Zeilenvorschub (Newline). Auf den meisten Betriebssystemen (insbesondere Unix und DOS/Windows) das Linefeed-Zeichen, ASCII <LF>, oktal 012. Unter MacOS ist das ASCII <CR>, oktal 015. Bei Java und den .NET-Sprachen ist das immer das Zeichen ASCII <LF>, unabhängig vom Betriebssystem.

\r

Wagenrücklauf (Carriage Return). Normalerweise ASCII <CR>. Unter MacOS ist das ASCII <LF>. Bei Java und den .NET-Sprachen ist das immer das Zeichen ASCII <CR>, unabhängig vom Betriebssystem.

\t

Tabulator (Tab). Das normale, horizontale Tabulator-Zeichen. Normalerweise ASCII <HT>, oktal 011.

\v

Vertikaler Tabulator. Normalerweise ASCII <VT>, oktal 013.

 

In der nächsten Tabelle sind einige verbreitete Werkzeuge und Programmiersprachen mit den unterstützten Abkürzungsmetazeichen aufgelistet. Wie weiter vorn erwähnt wurde, werden in manchen Programmiersprachen die gleichen Abkürzungszeichen auch in Strings verwendet. Unter Strings als reguläre Ausdrücke werden auch die Gefahren beim Verwechseln von String- und Regex-Metazeichen beschrieben.

Sind diese Zeichen maschinenabhängig?

Wie in der Liste oben erwähnt, ist die Bedeutung von \n und \r für die meisten Werkzeuge und Programmiersprachen vom Betriebssystem abhängig, (Anmerkung: Wenn das Programm selbst in C oder C++ geschrieben ist und es die Regex-Escapes in das entsprechende String-Metazeichen von C übersetzt, dann ist das so entstehende Zeichen von der Art des C-Compilers abhängig. In der Praxis verwenden alle Compiler für ein bestimmtes Betriebssystem die gleiche Konvention, man kann diese Werte daher mit Recht »betriebssystemabhängig« nennen. Es sieht so aus, als ob nur bei \n und \r überhaupt Unterschiede zwischen Betriebssystemen bestehen (und diese Unterschiede werden immer weniger); die anderen kann man als standardisiert betrachten.) man muss diesen also Beachtung schenken. Wenn Sie »ein Newline« brauchen und nichts Genaueres wissen, dann ist \n das Richtige. Wenn Sie ein Zeichen mit einem ganz bestimmten Wert benötigen, wenn Sie beispielsweise Code für ein standardisiertes Protokoll wie HTTP schreiben, dann brauchen Sie \012 oder was immer das Protokoll verlangt (\012 ist ein oktales Escape für das ASCII-Zeichen LF). Wenn Sie auf ein DOS-Zeilenende prüfen wollen, verwenden Sie ˹\015?\012˼ (diese passen auf die Zeichen am Zeilenende – wenn Sie die Position am Zeilenanfang oder am Ende suchen, benutzen Sie die Zeilenanker, siehe Anker und andere »Zusicherungen der Länge null«).

Tabelle: Einige Programme und die darin unterstützten Abkürzungen für Metazeichen.

Programm Abkürzungsmetazeichen
\b
Wortgrenze
\b
Backspace
\a
Alarm
\e
ASCII-ESC
\f
Form Feed
\n
Newline
\r
Carr. Ret.
\t
Tabulator
\v
Vert. Tab
Python ✓c
Tcl ja, \y
Perl ✓c
Java ✓x x ✓sr ✓sr ✓sr ✓sr
GNU awk
GNU sed
GNU Emacs ✓x s s s s s s s s
.NET ✓c
PHP (preg-Paket) ✓c
MySQL
GNU grep/egrep
flex
Ruby ✓c
  

unterstützt
✓c nur in Zeichenklassen unterstützt
✓sr unterstützt, auch als String-Metazeichen
✓x unterstützt, hat in Strings eine andere Bedeutung
x nicht unterstützt, hat in Strings eine andere Bedeutung
s nicht unterstützt, aber als String-Metazeichen unterstützt
Ich gehe in dieser Tabelle davon aus, dass jeweils der »Regex-freundlichste« String-Typ verwendet wird (siehe Strings als reguläre Ausdrücke)

Oktale Escapes: \Zahl

Viele Implementationen erlauben die zwei- oder dreistellige oktale (Basis 8) Notation, um ein Byte mit einem bestimmten ASCII-Code zu erzeugen. Zum Beispiel erkennt ˹\015\012˼ die ASCII-CR/LF-Sequenz. Das ist ganz praktisch, da man diese Zeichen oft nicht vernünftig eingeben kann. In Perl ist ˹\e˼ für das ASCII-ESC-Zeichen unterstützt, aber nicht in awk. Dagegen kennt awk oktale Escapes, und man kann den ASCII-Code für das Escape direkt eingeben: ˹\033˼.

In der folgenden Tabelle sind einige Programme und die von ihnen unterstützten oktalen Escapes aufgelistet.

Bei manchen Implementationen ist ˹\0˼ ein Spezialfall und passt auf das NUL-Byte. Bei anderen Programmen sind auch oktale Escapes mit nur einer oktalen Ziffer erlaubt. Das sind meist solche, die keine Rückwärtsreferenzen wie ˹\1˼ unterstützen. Wenn es eine Mehrdeutigkeit gibt, hat die Interpretation als Rückwärtsreferenz im Allgemeinen Vorrang. Bei manchen Programmiersprachen sind auch vierstellige oktale Sequenzen zugelassen. Meist muss dann aber die erste oktale Ziffer eine Null sein (z.B. bei java.util.regex).

Man muss sich auch fragen, was mit oktalen Werten wie \565 geschieht, die außerhalb des zulässigen Bereichs liegen (oktale 8-Bit-Zahlen liegen im Bereich von \000 bis \377). Nun, etwa die Hälfte der Programme verwendet dafür automatisch eine interne Darstellung, die mehr als ein Byte umfasst (der Wert könnte ja auf ein Unicode-Zeichen passen). Die andere Hälfte entfernt die vorderen Bits, so dass in diesem Fall \165 herauskommt, was dem ASCII-›u‹ entspricht. Sie sollten sich daher auf oktale Escapes bis \377 beschränken.

Hexadezimale Escapes und Unicode-Escapes: \xZahl, \x{Zahl}, \uZahl, \UZahl, ...

Analog zu oktalen Escapes lassen bestimmte Programme hexadezimale (Basis 16) Escapes zu, indem man den Hex-Ziffern ein \x, ein \u oder manchmal auch ein \U voranstellt. Wenn \x unterstützt wird, sieht die CR/LF-Sequenz so aus: ˹\x0D\x0A˼. In der folgenden Tabelle sind auch die hexadezimalen Escapes aufgeführt.

Außer der Verwendung des richtigen Escape ist auch noch wichtig, wie viele hexadezimale Ziffern zulässig sind und ob geschweifte Klammern um die Hex-Ziffern zulässig oder gar vorgeschrieben sind. Auch das wird in der folgenden Tabelle angegeben.

Tabelle: Einige Programme und die darin unterstützten oktalen und hexadezimalen Escapes.

Rückwärtsreferenzen Oktale Escapes Hexadezimale Escapes
Python \0, \07, \377 \xFF
Tcl \0, \77, \777 \x... \uFFFF, \UFFFFFFFF
Perl \0, \77, \777 \xF, \xFF, \x{...}
Java \07, \077, \0377 \xFF, \uFFFF
GNU awk \7, \77, \377 \x...
GNU sed
GNU Emacs
.NET \0, \77, \377 \xFF, \uFFFF
PHP (preg-Funktionen) \0, \77, \377 \xF, \xFF, \x{...}
MySQL
GNU egrep
GNU grep
flex \7, \77, \377 \xF, \xFF
Ruby \7, \77, \377 \xF, \xFF

\0 ˹\0˼ erkennt das NUL-Byte, sonst keine Unterstützung für einstellige oktale Escapes
\7, \77 ein- und zweistellige oktale Escapes werden unterstützt
\07 zweistellige oktale Escapes nur mit führender Null unterstützt
\077 dreistellige oktale Escapes nur mit führender Null unterstützt
\377 dreistellige oktale Escapes bis \377 unterstützt
\0377 vierstellige oktale Escapes bis \0377 unterstützt
\777 dreistellige oktale Escapes bis \777 unterstützt
\x... \x mit beliebiger Anzahl von Ziffern erlaubt
\x{...} \x{...} mit beliebiger Anzahl von Ziffern erlaubt
\xF, \xFF ein- und zweistellige hexadezimale Escapes mit \x unterstützt
\uFFFF vierstellige hexadezimale Escapes mit \u unterstützt
\UFFFF vierstellige hexadezimale Escapes mit \U unterstützt
\UFFFFFFFF achtstellige hexadezimale Escapes mit \U unterstützt
Programmversionen siehe den Abschnitt Programmversionen in diesem Buch.

Steuerzeichen: \cZeichen

In vielen Regex-Dialekten kann man mit der Sequenz \cZeichen ein Steuerzeichen mit einem ASCII-Wert unter 32 angeben (manche erlauben auch einen größeren Bereich). Zum Beispiel passt ˹\cH˼ auf Strg-H, was dem Backspace entspricht, oder ˹\cJ˼ passt auf das ASCII-Zeichen Line Feed (das oft auch von ˹\n˼, aber manchmal von ˹\r˼ erkannt wird, je nach Betriebssystem, siehe oben unter Abkürzungsmetazeichen).

Die Details zu diesem Konstrukt sind uneinheitlich. Mit den ASCII-Großbuchstaben ist man auf der sicheren Seite. Die meisten Implementationen erlauben auch Kleinbuchstaben, nicht aber das Java-Regex-Package von Sun. Was mit nicht-alphabetischen Zeichen passiert, hängt ganz vom jeweiligen Dialekt ab; ich empfehle, mit \c nur Großbuchstaben zu benutzen.

GNU Emacs hat eine ganz andere Metasequenz für den gleichen Zweck: ˹?\^Zeichen˼ (d.h. ˹?\^H˼ passt auf Strg-H, das ASCII-Backspace-Zeichen).

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:
   

Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln