Der Regex-Dialekt von Java

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

java.util.regex benutzt einen traditionellen NFA; die Betrachtungen aus Wie Regex-Maschinen arbeiten, Regex-Methoden aus der Praxis und Die Kunst, reguläre Ausdrücke zu schreiben sind also auch für dieses Paket anwendbar. In der folgenden Tabelle sind die unterstützten Metazeichen zusammengefasst. Bestimmte Aspekte des Dialekts können mit Modifikatoren gesteuert werden, die man mit Optionen bei den diversen Funktionen und Factory-Methoden ein- und ausschalten kann. Man kann die Modifikatoren auch in der Regex mit der Syntax (?mod-mod) oder (?mod-mod:...) aktivieren oder deaktivieren. Die unterstützten Modi sind in der Tabelle Die Regex-Modi bei java.util.regex aufgeführt.

Tabelle: Elemente von regulären Ausdrücken in java.util.regex von Sun – Übersicht.

Abkürzungen für Zeichen 1.
siehe Abkürzungsmetazeichen (K) \a [\b] \e \f \n \r \t \Ooktal \x## \u#### \cZeichen
Zeichenklassen und ähnliche Konstrukte
siehe Normale Klassen: [a-z] und [^a-z] (K) Klassen: [...] [^...] (kann Mengenoperationen enthalten, siehe Mengenoperationen mit Zeichenklassen: [[a-z]&&[^aeiou]])
siehe Fast jedes Zeichen: Punkt    Fast jedes Zeichen: Punkt (verschiedene Bedeutungen, hängt vom Modus ab)
siehe Abkürzungen für Zeichenklassen (K) Abkürzungen für Zeichenklassen:2. \w \d \s \W \D \S
siehe Unicode-Eigenschaften, Schriftsysteme (Scripts) und Blockbereiche (K) Unicode-Eigenschaften und -Blockbereiche:3. \p{Prop} \P{Prop}
Anker und andere Zusicherungen der Länge null
siehe Zeilenanfang, Stringanfang    Anfang der Zeile oder des Strings: ^ \A
siehe Zeilenende, Stringende    Ende der Zeile oder des Strings: $ \z \Z
siehe Beginn der neuen (oder Ende der letzten) Mustersuche: \G    Anfang des aktuellen Treffers: \G
siehe Wortgrenzen    Wortgrenze:4. \b \B
siehe Lookahead; Lookbehind    Lookaround:5. (?=...) (?!...) (?<=...) (?<!...)</td>
Kommentare und Modus-Modifikatoren
siehe Modus-Modifikatoren    Modus-Modifikatoren: (?mod-mod) Erlaubte Modifikatoren: x d s m i u
siehe Modus-Modifikatoren mit Klammerung    Bereich für Modus-Modifikatoren: (?mod-mod:...)
siehe Die Sequenz # (K) Kommentare: Von # bis zum Zeilenende (nur wenn eingeschaltet)6.
siehe Modus für literalen Text (K) Modus für literalen Text:7. \Q...\E
Gruppieren und Einfangen von Text
siehe Gruppierende und einfangende Klammern    Einfangende Klammern: (...) \1 \2 ...
siehe Nur gruppierende (nicht-einfangende) Klammern    Nur gruppierende Klammern: (?:...)
siehe Atomare Klammern    Atomare Gruppen: (?>...)
siehe Alternation    Alternation: |
siehe Gierige Quantoren    Gierige Quantoren: * + ? {n} {n,} {x,y}
siehe Nicht-gierige, »genügsame« Quantoren    Nicht-gierige (genügsame) Quantoren: *? +? ?? {n}? {n,}? {x,y}?
siehe Possessive Quantoren    Possessive Quantoren: *+ ++ ?+ {n}+ {n,}+ {x,y}+

(K) – kann in einer Zeichenklasse verwendet werden. 1....7. siehe Text

Die folgenden Bemerkungen kommentieren die obige Tabelle:

  1. Das Metazeichen \b steht nur innerhalb von Zeichenklassen für ein Backspace. Außerhalb von Zeichenklassen ist \b ein Metazeichen für Wortgrenzen (siehe Wortgrenzen).

    In der Tabelle werden »nackte« Backslashes aufgeführt, nicht die verdoppelten, die man benutzen muss, wenn reguläre Ausdrücke als literale Strings angegeben werden. In einem String muss das ˹\n˼ aus der Tabelle als "\\n" codiert werden. Siehe Strings als reguläre Ausdrücke.

    Bei \x## müssen exakt zwei hexadezimale Ziffern angegeben werden, d.h. ˹\xFCber˼ passt auf über‹.

    Bei \u#### müssen exakt vier hexadezimale Ziffern angegeben werden, d.h. ˹\u00FCber˼ passt auf über‹ und ˹\u20AC˼ passt auf das €-Zeichen.

    Bei \0oktal ist die führende 0 obligatorisch, danach können eine bis drei oktale Ziffern folgen, also beispielsweise \0134 für den Backslash.

    Bei \cZeichen werden Groß- und Kleinbuchstaben skurrilerweise unterschiedlich behandelt; der entsprechende ASCII-Code wird blind mit 64 ge-xor-t. Das bedeutet, dass im Gegensatz zu allen anderen mir bekannten Implementationen \cA und \ca nicht dasselbe sind. \cA entspricht also dem gewohnten Strg-A, normalerweise wird man daher Großbuchstaben benutzen. \ca dagegen ist dasselbe wie \x21 und passt auf ›!‹.

  2. \w, \d und \s (und die entsprechenden Sequenzen mit Großbuchstaben) beziehen sich nur auf ASCII-Zeichen und nicht auf die erweiterten alphanumerischen Zeichen, Ziffern oder Whitespace von Unicode. Also ist \d exakt dasselbe wie [0-9], \w ist dasselbe wie [0-9a-zA-Z_], und \s ist dasselbe wie [\t\n\f\r\x0B] (\x0B ist das selten verwendete VT-Zeichen aus ASCII).

    Für die entsprechenden Unicode-Äquivalente kann man Unicode-Eigenschaften benutzen: \p{L} für \w, \p{Nd} für \d und \p{Z} für \s (und jeweils die \P{...}-Version für \W, \D und \S).

  3. \p{...} und \P{...} unterstützen die meisten Standardeigenschaften und -blockbereiche von Unicode und außerdem ein paar »Java-Eigenschaften«. Schriftsysteme (Scripts) werden nicht unterstützt. Einzelheiten dazu folgen im nächsten Unterabschnitt.
  4. Die Definition für »Wortgrenze« bei \b und \B stimmt nicht mit der Definition für »Wortzeichen« bei \w und \W überein. Die Metazeichen \b und \B werten dazu die Unicode-Eigenschaften der Zeichen links und rechts aus, während \w und \W auf ASCII-Zeichen beschränkt sind.
  5. In Lookahead-Konstrukten dürfen beliebig komplizierte reguläre Ausdrücke verwendet werden, bei Lookbehind dagegen nur solche, die auf Strings mit einer vorgegebenen Maximallänge passen. Der Quantor ˹?˼ ist also in einem Lookbehind-Konstrukt erlaubt, nicht aber ˹*˼ und ˹+˼. Diese Einschränkung wurde unter Features und Dialekte bei Lookahead; Lookbehind genauer erläutert.
  6. Die Sequenz #...NL wird nur dann als Kommentar behandelt, wenn die Option Pattern.COMMENTS oder der x-Modifikator benutzt wird (siehe die folgende Tabelle "Die Regex-Modi bei java.util.regex"). (Vergessen Sie das Newline am Ende von mehrzeiligen Strings nicht, siehe dazu das Beispiel in Daten im CSV-Format verarbeiten.)

    ASCII-Whitespace-Zeichen ohne Backslash davor werden ignoriert. Achtung: Anders als bei den meisten Programmiersprachen, die Kommentare in der Regex zulassen, kann man hier Kommentare und Whitespace auch innerhalb von Zeichenklassen verwenden.

  7. \Q...\E wurden von Anfang an unterstützt. Seine Verwendung innerhalb von Zeichenklassen war jedoch vor Java 1.6 fehlerbehaftet und unzuverlässig.

     

Tabelle: Die Regex-Modi bei java.util.regex.

Option zur Kompilationszeit (?mod) Beschreibung
Pattern.UNIX_LINES d Beeinflusst die Art, wie ˹.˼ und ˹^˼ passen (siehe ˹.˼, ˹^˼, ˹$˼ und ˹\Z˼ werden unterschiedlich interpretiert).
Pattern.DOTALL s Bewirkt, dass der Punkt auf jedes Zeichen passt (siehe Der Modus »Punkt passt auf alles«).
Pattern.MULTILINE m ˹^˼ und ˹$˼ passen auch auf interne Zeilengrenzen (siehe Zeilenendezeichen in Unicode).
Pattern.COMMENTS x Modus »Freie Form« und Kommentare in der Regex (siehe unter Username und Hostname, funktioniert auch innerhalb von Zeichenklassen).
Pattern.CASE_INSENSITIVE i Groß- und Kleinschreibung von ASCII-Zeichen wird nicht beachtet.
Pattern.UNICODE_CASE u Groß- und Kleinschreibung von beliebigen Zeichen wird nicht beachtet.
Pattern.CANON_EQ Zeichenvergleich nach Unicode, »canonical equivalence« (gleiche Zeichen sind auch dann gleich, wenn sie verschieden codiert sind, siehe Mehrere Codierungspunkte für dasselbe Zeichen).
Pattern.LITERAL u Argument wird als fester Suchtext und nicht als Regex betrachtet.

Unterstützung von \p{...} und \P{...} in Java

Die Konstrukte ˹\p{...}˼ und ˹\P{...}˼ unterstützen Unicode-Eigenschaften und -Blockbereiche, außerdem einige besondere »Java-Eigenschaften«. Es wird Unicode 4.0.0 unterstützt (bis Java 1.4.2 allerdings nur Unicode 3.0.0).

  

  

<< 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