Weitere Pattern-Methoden

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

Zu den hauptsächlichen compile-Factory-Methoden gibt es in der Klasse Pattern ein paar Hilfsfunktionen:

split

Die zwei Ausprägungen dieser Methode werden ab Die split-Methode mit einem Argument im Detail behandelt.

String pattern()

Diese Methode gibt den regulären Ausdruck als String zurück, mit dem das Muster erzeugt wurde.

String toString()

Diese Methode bewirkt dasselbe wie pattern (ab Java 1.5).

int flags()

Diese Methode gibt den numerischen Wert der bei compile verwendeten Flags zurück.

static String quote(String text)

Diese statische Methode (die es ab Java 1.5 gibt) gibt einen String zurück, der bei Pattern.compile als Regex-Argument verwendet werden kann, so dass der Text als Literal und nicht als Regex interpretiert wird. Pattern.quote("main()") liefert beispielsweise den String ›\Qmain()\E‹, der als Regex ˹\Qmain()\E˼ interpretiert wird, und diese Regex passt genau auf den ursprünglichen String, ›main()‹.

static boolean matches(String muster, CharSequence suchtext)

Diese statische Funktion liefert einen booleschen Wert zurück, der angibt, ob die Regex in muster exakt auf die CharSequence suchtext passt (oder, wie bei der matcher-Methode, auf irgendein Objekt, das CharSequence implementiert, siehe Die matcher-Methode). Das entspricht im Wesentlichen:

Pattern.compile(muster).matcher(suchtext).matches();

Wenn Sie besondere Optionen angeben wollen oder mehr Informationen über den gefundenen Treffer benötigen als nur »Treffer oder nicht«, müssen Sie die früher besprochenen ausführlichen Methoden benutzen.

Wenn diese Methode immer wieder aufgerufen werden soll (in einer Schleife), dann ist es sehr viel effizienter, die Regex einmal in ein Pattern-Objekt zu kompilieren und bei jedem Gebrauch der Regex dieses vorkompilierte Muster zu verwenden.

Die split-Methode mit einem Argument

String[] split(CharSequence text)

Diese Pattern-Methode erwartet einen text (eine CharSequence) und gibt ein Array mit Strings zurück, die die Textstücke zwischen den Treffern der Regex des Objekts enthalten. Die Methode gibt es auch für String-Objekte.

In dem ganz einfachen Beispiel

String[] resultat = Pattern.compile("\\.").split("209.204.146.22");

wird ein Array mit vier Strings (›209‹, ›204‹, ›146‹ und ›22‹) zurückgegeben, die im Suchtext durch die Treffer der Regex ˹\.˼ getrennt sind. In diesem einfachen Beispiel ist das Trennzeichen ein einfaches literales Zeichen, aber der Trenner kann ein beliebig komplizierter regulärer Ausdruck sein. Man kann beispielsweise Wörter grob voneinander trennen, indem man als Trenner nicht-alphanumerische Strings nimmt:

String[] resultat = Pattern.compile("\\W+").split(Text);

Der String ›Was gibt'sDoc‹ wird damit in die vier Strings ›Was‹, ›gibt‹, ›s‹ und ›Doc‹ zerlegt, die von den drei Treffern getrennt werden. (Wenn der Text nicht nur ASCII-Zeichen enthält, sollte statt ˹\W+˼ vielleicht ˹\P{L}+˼ oder ˹[^\p{L}\p{N}_]˼ eingesetzt werden, siehe \p{...} und \P{...}.)

Leere Elemente bei aufeinanderfolgenden Treffern

Wenn die Regex des Objekts am Anfang des Texts passen kann, wird als erstes Element ein leerer String (das ist ein gültiger String, der keine Zeichen enthält) zurückgegeben. Ganz ähnlich wird auch dann ein leerer String zurückgegeben, wenn die Regex aufeinanderfolgende Treffer findet. Diese Leerstrings entsprechen einfach den »null Zeichen« zwischen den Treffern. Bei dem Beispiel

String[] resultat = Pattern.compile("\\s*,\\s*").split(", eins, zwei , ,, 3");

ist der Trenner ein Komma mit Whitespace davor und danach. Das ergibt ein Resultat-Array mit fünf Elementen: ›eins‹, ›zwei‹, zwei Leerstrings und ›3‹.

Leere Elemente am Ende des Arrays werden aber unterdrückt:

String[] resultat = Pattern.compile(":").split(":xx:");

Das ergibt nur zwei Strings, einen Leerstring und ›xx‹. Wenn die leeren Elemente am Ende wichtig sind, muss die split-Methode mit zwei Argumenten aufgerufen werden.

Die split-Methode mit zwei Argumenten

String[] split(CharSequence text, int limit)

Mit dieser Version von split kann man steuern, wie oft die Regex angesetzt werden soll und was mit leeren Elementen am Ende passieren soll. Auch diese Methode ist unter dem gleichen Namen in der String-Klasse vorhanden.

Das limit-Argument hat unterschiedliche Bedeutungen, je nachdem, ob sein Wert kleiner, gleich oder größer als null ist.

split mit einem Limit kleiner als null

Leere Elemente am Ende des Arrays werden nicht unterdrückt.

String[] resultat = Pattern.compile(":").split(":xx:", -1);

ergibt also ein Array mit drei Strings (ein Leerstring, ›xx‹ und ein weiterer Leerstring).

split mit einem Limit gleich null

Ein explizites zweites Argument von null wird genauso behandelt, als ob das Argument nicht angegeben würde; leere Elemente am Ende werden also unterdrückt.

split mit einem positiven Limit

Wenn das limit-Argument größer als null ist, bezeichnet es die maximale Anzahl der Elemente, die zurückgegeben werden sollen. Die Regex wird also maximal limit-1 mal angewandt (bei einem limit von 3 werden maximal drei Strings angefordert, die durch zwei Treffer getrennt sind).

Nach limit-1 Treffern werden keine weiteren Trenner mehr gesucht; vielmehr wird der gesamte Rest des Suchstrings im letzten Element zurückgegeben.

Wenn wir bei einem String der folgenden Art

Friedl,Jeffrey,Eric Francis,America,Ohio,Rootstown

nur an den ersten drei Komponenten interessiert sind, können wir den String in vier Teile splitten (in die drei Namensteile und einen vierten Teil, der alles andere enthält):

String[] NameInfo = Pattern.compile(",").split(Text, 4);
// NameInfo[0] ist der Nachname
// NameInfo[1] ist der Vorname
// NameInfo[2] enthält weitere Vornamen
// NameInfo[3] enthält alles andere, was wir im Weiteren sowieso nicht benötigen.

Wenn wir ein maximales Limit angeben, ersparen wir der Maschine Arbeit – warum sollen alle weiteren Felder gefunden werden, wenn wir ohnehin nur an den ersten drei interessiert sind. Mit dem Limit-Argument kann also die Effizienz verbessert werden.

  

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